linux 의 qos 메커니즘 - dm - ioband 편 (4)

이 편 은 전편 의 내용 을 이 어 가 며 몇 가지 전형 적 인 장면 을 통 해 dm - ioband 의 업무 절 차 를 분석한다.
첫 장면 은 요. http://sourceforge.net/apps/trac/ioband/wiki/dm-ioband/man/examples example 1, 우선 명령 을 호출 하여 두 개의 ioband device 를 만 듭 니 다.
# echo "0 $(blockdev --getsize /dev/sda1) ioband /dev/sda1 1 0 0 none weight 0 :80" | dmsetup create ioband1
# echo "0 $(blockdev --getsize /dev/sda2) ioband /dev/sda2 1 0 0 none weight 0 :40" | dmsetup create ioband2

dmsetup 은 ioband 를 호출 합 니 다.ctr 에서 ioband 장 치 를 만 듭 니 다. iobandctr 의 주석 은 매개 변수 순 서 를 볼 수 있 습 니 다.
/*  * Create a new band device:  *   parameters:    *      */
그 중 < device - group - id > 는 iobanddevice->g_name, ioband 장 치 를 유일 하 게 표시 합 니 다.P. S. 여기 ioband 1, ioband 2 두 장 치 는 같은 ioband 에 대응 합 니 다.device, ioband - group - id 는 1 입 니 다. 。들 어 오 는 < device > 는 / dev / sda 1, / dev / sda 2 와 같은 실제 블록 장치 입 니 다.dm 호출get_device 이 장 치 를 dm 에 추가 합 니 다.table - > devices 목록 에 있 습 니 다.다음 호출 allocioband_device( , , ) ioband 만 들 기device, 이 때 는 < device - group - id > 가 1 인 ioband 가 있 기 때 문 입 니 다.device, 그래서 간단하게 iobanddevice->g_ref + + 가 끝 났 습 니 다.커 널 ioband_device_list 의 listhead, 모든 iobanddevice 는 모두 이 list 에 속 합 니 다.head, 이 iobanddevice 통과 iobanddevice->g_list 조직.
다음은 policy 호출init, 들 어 오 는 매개 변 수 는 < policy > < policy - param... > < group - id: groupparam... >, 우선 policy 이름 의 비 교 를 진행 합 니 다. 전역 변수 dmioband_policy_type 에서 이름 이 weight 인 policy 를 조회 한 후 대응 하 는 policy 를 호출 합 니 다.weight_init 함수.P.S. ioband_device 의 ggroups 는 attach 위 에 있 는 모든 ioband 를 연결 합 니 다.group, 이 listhead 의 변 수 는 ioband 에 대응 합 니 다.group 의 clist 멤버, container 를 통 해of 宏 은 iobandgroup。 얻 은 struct iobandpolicy_type ioband 에 할당device->g_policy。
정책 호출weight_init 일 때 들 어 오 는 매개 변 수 는 < policy - param... > < group - id: group - param... > 입 니 다.weight policy 의 첫 번 째 매개 변 수 는 < token base > 이 고, 그 다음은 < group - id: group - param > 의 배열, policy 입 니 다.weight_init 아니 < group - id: group - param > 의 대열 을 처리 하 다.
다음은 iobandgroup_init 는 먼저 default ioband group 을 만 듭 니 다. 이 장면 에서 같은 ioband 가 있 습 니 다.device 에 두 개의 default ioband 가 나 타 났 습 니 다.group, 그 중 cid 는 IOBANDID_ANY。ioband_device->g_root_groups 가 같은 것 을 저 장 했 습 니 다.  모든 루트 group, iobandgroup_init 는 listadd_tail, iobanddevice->g_root_groups ioband 에 추가group->c_sibling 에서 모든 ioband 를 볼 수 있 습 니 다.group->c_sibling 은 같은 등급 의 모든 ioband 를 저장 합 니 다.group, 그리고 iobanddevice->g_root_groups 의 모든 ioband그룹 은 서로 sibling 입 니 다.이 장면 에서 두 iobandgroup 의 cparent, c_children 모두 비어 있 습 니 다. csibling 에는 ioband 가 두 개 있 습 니 다.group。
iobandgroup 다른 멤버: cchildren 은 이 group 아래 의 모든 하위 group, cparent 는 부모 그룹, c형제 그룹group 은 붉 은 검 은 나무의 구조 에 따라 조직 되 어 있 습 니 다. cgroup_루트 는 이 붉 은 검 은 나무의 뿌리 를 나타 낸다. cgroup_node 는 현재 group 이 이 빨 간 검 은 나무 에 있 는 노드 를 표시 합 니 다.
마지막 으로 ioband 호출group_type_select 선택 iobandgroup_type, 여기 type 은 none 입 니 다.
############################
OK, 이제 요청 실행 흐름 을 살 펴 보 겠 습 니 다. device mapper 에 들 어가 기 를 요청 하면 최종 적 으로 ioband 로 떨 어 집 니 다.map 함수 중, iobandmap 실행 절 차 는 다음 과 같 습 니 다.
  • ioband 호출group_get, bio 에 대응 하 는 ioband 가 져 오기group。하면, 만약, 만약...getid 함수 포인터 가 비어 있 습 니 다. default group 임 을 설명 합 니 다. 그렇지 않 으 면 bio 에 따라 dm 를 호출 합 니 다.ioband_group_type 해당 함수 그룹 type 가 져 오기
  • < device - group - id > 가 1 인 iobanddevice 는 두 개의 default group 만 있 고 group 에서 함수 policy 를 초기 화 합 니 다.weight_ctr 시 token 을 할당 합 니 다.policy_weight_ctr 는 policy 를 호출 합 니 다.weight_param, 최종 호출 setweight 로 weight 를 설정 합 니 다.
  • set_weight 먼저 ioband 채 우기group->c_weight, c 계산sibling 모든 cweight 의 합, base 꺼 내기token,base_io_limit 등 값 (즉, parent 의 token, io limit 값, parent 가 비어 있 으 면 ioband device 의 해당 값) 을 호출set_weight 。 __set_weight 안에 cweight 가 차지 하 는 비중 은 basetoken 분배 token, base 기반io_한계 분배 iolimit, parent 의 해당 값 을 수정 할 필요 가 있다 면.이로써 iobandgroup->c_token, ioband_group->c_token_initial, ioband_group->c_token_bucket 값 은 모두 분 배 된 token 값 으로 설정 되 어 있 습 니 다.
  • 요청 처리 시 판단 istoken_left 남 은 token 사용 가능 여부, 있 으 면 consume 호출token, 이렇게 bio 가 실 행 됩 니 다.그렇지 않 으 면 delayed 를 호출 합 니 다.작업 메커니즘 지연 처리
  • 처리 지연 iobandconduct 방법 은 한 번 판단 합 니 다. 만약 nrblocked(dp),room_for_bio_sync(dp, BLK_RW_SYNC/ASYNC),issue_list, pushback_list 가 모두 비어 있 습 니 다. 이 세 가지 조건 이 성립 되 었 습 니 다. 나머지 block 의 bio 는 모두 token 이 소 진 되 었 기 때문에 dp - > g 를 호출 한 것 을 의미 합 니 다.restart_bios 에서 token 을 다시 내 보 냅 니 다. 이 행 위 는 Makeglobal_epoch 완성
  • make_global_epoch 는 매우 재 미 있 는 함수 입 니 다. 우선 ioband 를 찾 습 니 다.device 에서 token 이 가장 많은 group 을 가지 고 있 습 니 다. 이 group 이 가 진 token 이 너무 많 으 면 이 group 의 IO 부하 가 높 으 면 (iopriority (gp) * PROCESS THRESHOLD > IOBAND IOPRIO BASE & & & nr issued (dp) > dp - > g io throttle) 이 group 에 우선 서 비 스 를 제공 합 니 다. token 을 놓 지 않 습 니 다. 그렇지 않 으 면 iobanddevice 는 epoch 를 추가 합 니 다. 모든 group 에 ioband 를 증가 합 니 다.group->c_token_initial 개수 token
  • 이 장면 의 극단 적 인 상황, 즉 default group 은 IO 요청 이 있 었 고 다른 하 나 는 계속 없 었 다. 이런 체 제 는 group 이 token - starving 이 없 음 을 보증 할 것 이다.
    화려 한 분할 선
    두 번 째 장면 은 요. http://sourceforge.net/apps/trac/ioband/wiki/dm-ioband/man/examples 의 example 3, 이런 장면 에서 ioband 2 에 uid = 1000, weight = 20 의 group 이 추가 되 었 습 니 다.
    우선ioband_message type 을 uid 로 설정 합 니 다.
    그 다음은ioband_message 에서 ioband 호출group_attach (struct ioband group * head, 0, 1000, NULL) 시 head 는 원래 default group 의 지침 입 니 다. 현재 head - > ctype dmioband_group_type 의 uid group type.parent_id 는 0 이 고 group id 는 1000 입 니 다.이후 ioband 호출group_init (dp, head, NULL, gp, 1000, NULL), 여기 gp 는 새로 분 배 된 메모리 입 니 다. ioband 를 저장 하 는 데 사 용 됩 니 다.group, 여기 gp - > cid = id, 이때 iobandgroup 의 id 는 default group 의 IOBAND 가 아 닙 니 다.ID_ANY 입 니 다. uid 1000 입 니 다.이 새로 분 배 된 iobandgroup ioband 에 걸 림device 의 g그룹 아래, 그래서 이 iobanddevice 는 현재 3 개의 ioband 가 있 습 니 다.group。동시에 ioband 2 이 group 의 빨 간 검 은 나무 아래 에 두 개의 node 가 있 고 하 나 는 default group 에 속 하 며 하 나 는 uid group 에 속 합 니 다.이 두 그룹의 cdev,c_target 은 모두 같 습 니 다.
    마지막 호출ioband_message 의 iobandset_파 람 으로 weight 를 설정 합 니 다.마지막 으로 policy 호출weight_param(gp, "weight", "20") 。
    현재 iobanddevice 아래 에 3 개의 ioband 가 있 습 니 다.group 입 니 다. 그렇다면 요청 이 어떤 group 에 속 하 는 지 어떻게 압 니까?기억 해 iobandmap 의 iobandgroup_get 이 요? ioband 2 를 위 한 user = 1000 프로 세 스 요청 에 대해 ioband 로 전 송 됩 니 다.group_get 의 첫 번 째 매개 변 수 는 default group 의 지침 입 니 다.이 때 default group 의 c 때문에type 은 uid group type 이 되 었 습 니 다. ioband 를 호출 합 니 다.group_find 붉 은 검 은 나무 에서 c 찾기id = 1000 의 iobandgroup, 이 알고리즘 은 c 로 되 돌아 갑 니 다.id 1000 rbnode, c 로 돌아 가 거나id 는 IOBANDID_ANY default group 의 rbnode, 따라서 uid = 1000 프로 세 스 가 보 내 는 bio 가 아니 라 마지막 에 default group 에 떨 어 집 니 다.uid = 1000 프로 세 스 가 보 내 는 bio 는 c 로 떨 어 집 니 다.id = 1000 의 ioband그룹 상.
    마지막 으로 요약 하면 이 < device - group - id > 는 g 를 포함 합 니 다.ref 2 의 iobanddevice, 안에 두 개의 장치 / dev / mapper / ioband 1, / dev / mapper / ioband 2 가 있 으 며, 동시에 3 개의 ioband 가 있 습 니 다.group, 권한 에 따라 token 공유

    좋은 웹페이지 즐겨찾기