PNUCSE / Capstone-2022-1-43

Other
0 stars 0 forks source link

About Reclaim Process in dm-zoned target device mapper #3

Open kyungmin-Earnest-Lim opened 1 year ago

kyungmin-Earnest-Lim commented 1 year ago

dmz_reclaim 내부구조

  1. dmz_reclaim은 reclaim 대상이 된 zone의 정보를 담고있다.
  2. struct metadata, work_queue(work와 queue를 만들고 작업을 스케쥴하는 동작을 위함), kcopyd_client(하나의 block 장치에서 하나 이상의 다른 블록장치로 sector 범위를 복사하는 기능을 제공)
  3. flag(이 zone이 reclaim 대상인지, 아닌지를 표시), kc_err(섹터 범위 복사중 err 발생을 알리고 작업 중단할 대 쓰이는 값), atime(reclaim할 때 가장 접근이 오래된 zone을 reclaim하는데 이때 last access time 값을 이용한다.)

dm_zone 내부구조 - zone의 기본 정보를 담고있는 struct

  1. dmz_dev -> device의 정보를 담고있는 struct
  2. bzone -> sequential zone일 경우, buffer로 사용할 수 있는 random access zone의 위치를 가지고 있다.
  3. wp_block -> write pointer block의 위치를 표시
  4. chunk는 현재 해당 zone과 매핑되어있는 data chunk의 위치를 저장하고 있다.
  5. flag의 용도는 다양하지만, reclaim process에서는 destination zone이 sequential인지 아닌지 판단하기 위해 쓰인다. , 실제로 block을 옮기는 동작 중 flag값을 활용하여 sequential zone으로 옮길때 error를 방지한다.
  6. weight -> Zone wright (number of valid blocks in the zone)

dmz_reclaim_work -> dmz_do_reclaim 수행

dmz_do_reclaim 내부 동작

  1. 해당 함수가 실행되면 buffer/data zone의 상황에 따라 비어있는 zone을 reclaim할지, buffer에서 data zone으로 block을 옮길지, random data zone에서 sequential zone으로 옮길지 결정한다.
dmz_reclaim_copy는 zone에서 다른 zone으로 valid block들을 이동시켜주는 동작을 한다. valid block을 옮긴 후 dst_zone이 sequential이라면 write pointer를 수정해준다. sequential zone으로 옮길 때는 sequential write해야하기 때문에 src_zone의 first valid block과 dst_zone의 write pointer의 위치에 따라 동작이 바뀐다. src_zone에서 first valid block의 위치는 distance라고 가정하겠다. 1) distance와 write pointer가 같은 위치일 때 그림과 같이 바로 그 위치 그대로 dst_zone으로 옮기면 된다. 옮긴 후 그 크기만큼 write pointer를 수정한다. 2) distance가 write pointer보다 멀리 있을 때(distance > write pointer) 이 경우 distance와 write pointer의 차를 구한 후 write pointer에서 두 값의 차이 만큼 0으로 채운 후 valid block을 옮긴다. 3) distance가 write pointer보다 작을 때(distance < write pointer) 해당 경우는 error를 일으킨다. dst_zone이 sequential인 경우 distance >= write pointer인 경우만 작동한다. 현재 chunk 와 mapping되어 있는 zone에 data가 있고, 해당 zone이 buffer로 사용하는 bzone에도 데이터가 있는 상황인 경우 function dmz_reclaim_buf 는 buffer -> sequential zone으로 valid block들을 옮긴다. buffer에 있는 valid block을 옮긴 후, buffer의 valid block bitmap을 dst_zone의 bitmap과 merge한 후, buffer를 빈 상태로 만들어주기 위해 free시킨다. chunk가 가리키고 있는 zone의 데이터들이 이동하지 않았으므로 chunk와의 mapping을 수정해줄 필요는 없다. 현재 chunk와 mapping되어 있는 zone에 data가 있고, 해당 zone의 buffer에도 data가 있다. function dmz_reclaim_seq_data 는 sequential zone에 있는 valid data들을 buffer(bzone)으로 옮기는 역할을 한다. block들을 옮긴 후 dst_zone의 valid bitmap block을 merge한다. valid block을 buffer에 옮긴후 bitmap까지 merge 하는 동작까지 dmz_reclaim_buf와 유사하지만, chunk와 직접적으로 mapping되어있는 block들을 모두 옮겼기 때문에, 새로운 데이터가 있는 위치로 매핑 위치를 수정해주는 것이 차이점이다. 현재 data chunk와 mapping되어있는 zone이 random zone인 상황이다. function dmz_reclaim_rnd_data는 random zone에서 sequential zone으로 valid block들을 옮겨준다. 이 함수는 free sequential zone에 block들을 옮기는 것이 특징이다. After moving valid blocks, chunk와 mapping되어있는 zone의 block들이 새로운 zone으로 옮겨졌으니, mapping 위치도 수정해야한다. dmz_do_reclaim은 zone의 여러 조건을 확인한 후 그에 상응하는 동작을 수행한다. 먼저 function dmz_get_zone_for_reclaim 을 통해 reclaim 대상이 될 zone을 가져온다. dmz_get_zone_for_reclaim 내부 구성 1. free한 sequential zone이 하나도 없는 경우 random zone을 reclaim하려면(dmz_reclaim_rnd_data) -> free sequential zone이 반드시 필요하다. 따라서 sequential zone에서 reclaim 대상이 될 zone을 선택한다. 2. 적어도 하나의 free sequential zone이 있는 경우 access time이 가장 오래된 random write zone을 reclaim 대상으로 선택한다. ㅡㅡㅡㅡㅡ 받아온 zone이 random zone일 경우 먼저 비어있는지 확인한다. 비어 있다면 dmz_reclaim_empty 함수를 호출한다. valid block이 있으면, random data zone을 free sequential zone으로 옮기는 dmz_reclaim_rnd_data를 호출한다. zone이 sequential 할 경우 자신이 buffer로 사용하고 있는 zone이 비어있는지 확인한다. 비어있다면 buffer에서 data zone으로 valid block을 옮기는 dmz_reclaim_buf함수를 호출한다. buffer가 비어있지 않다면 buffer에서 first valid block의 위치를 계산하고 write pointer와 같거나 더 멀리 있으면 buffer에서 sequential zone으로 바로 이동시키는 것이 가능하므로 dmz_reclaim_buf 호출한다. distance 값이 write pointer보다 작은 경우 buffer에서 sequential zone으로 옮기는 것이 불가능하므로 sequential zone에서 buffer으로 옮긴 후 추후 자연스럽게 reclaim되도록 한다.
kyungmin-Earnest-Lim commented 1 year ago

do_reclaim -> dmz_reclaim_rnd_data : reclaim the random data zone by moving its valid data blocks to a free sequential zone

-> dmz_first_valid_block(zmd, bzone, &chunk_block) : &chunk_block for call by reference , find the first valid block from chunk_block in zone. if such a block is found, its number is returned using chunk_block and the total number of valid blocks from chunk_block is returned. by *chunk_block

-> dmz_reclaim_buf(zrc, dzone) : the buffer zone is empty or its valid blocks are after the data zone write pointer ? start this function

-> dmz_reclaim_seq_data(zrc, dzone) : reclaim the data zone by merging it into the buffer zone so that the buffer zone itself can be later reclaimed (나중에 버퍼 존이 reclaim될 수 있게 data zone을 buffer zone에 머지함으로서 reclaim)

kyungmin-Earnest-Lim commented 1 year ago

bzone -> random zone에 있는 buffer zone

dmz_reclaim_rnd_data : dzone -> szone -> random access zone에 있는 zone을 sequential data zone으로 reclaim -> 이미 쓰고 있는 zone이 아닌 free한 sequential zone으로 옮긴다. -> goto again 문을 통해 free한 sequential zone이 szone에 할당될때까지 반복 -> szone이 할당되면 dzone(random data zone)에서 szone(free sequential zone)으로 이동 -> 위는 dmz_merge_valid_block이 아닌 copy인 이유는 buf -> dzone 혹은 dzone -> buf로 이동하는 과정이므로 서로다른 bitmap을 가지고 있어서 merge해야 했지만, 지금은 하나의 zone을 옮기는 것이므로 bitmap은 변함없음 그래서 copy -> ret ==0 -> reclaim_copy가 잘되었으면 -> if(ret) -> reclaim_copy에서 오류가 난 경우 szone이 필요없으니 free해주는 과정 -> else -> copy가 잘되었다면 mapping되어있던 chunk data를 옮긴 곳으로 remap

dmz_reclaim_buf : bzone -> dzone -> buffer에서 sequential zone으로 reclaim시키는 함수 -> 옮겨야하는 zone에 연결되어있는 data를 unmapping한 후 reset시킨다. -> dzone이 가리키는 buffer에서 data를 가져온 것이므로 chunk data와 mapping되어있는 dzone을 새로 remap할 필요가 없다.

dmz_reclaim_seq_data : dzone -> bzone -> data zone에 있는 valid block을 buffer로 옮기는 함수이다. -> dzone의 valid block을 bzone(buffer로 옮긴다. -> 실제로 chunk data와 mapping된 dzone의 valid block들을 다른 zone(buffer)로 옮겼기 때문에 옮긴 곳으로 remap해주는 과정이 필요하다. -> dzone과 bzone이 연결된 곳을 모두 unmap한 후 valid block이 모두 옮겨진 dzone을 free -> 새로운 데이터가 있는 zone(buffer zone + data zone)에 원래 연결되어있던 chunk data를 mapping