bigsys-gnu / mvcc-os

KhronOS, a scalable operating systems based on sv6 (MIT) with MV-RLU (multi-version concurrency control mechanism)
Other
1 stars 0 forks source link

delete_mnum_inode_safe sometimes fails "assert(inum_lookup(mnum, &inum));" #88

Closed MadPlayer closed 9 months ago

MadPlayer commented 2 years ago

https://github.com/bigsys-gnu/mvcc-os/blob/9a8eb43a0521677b83f1baace24337b158f8c105/os/sv6/scalefs/kernel/scalefs.cc#L396-L409

chainhash에 mvrlu를 적용해서 scalefs의 작동을 테스트하고 있습니다. 주로 위의 assert를 패스하지 못하는 문제가 있습니다. image

위 오류는 mailbench-ben을 실행한 후에 확인한 것입니다. 원인은 memory leak 문제로 보입니다. 확인하는 방법은 Ctrl+f 를 연타해서 free page 수가 지속적으로 줄어들기만 하는 것을 확인할 수 있었습니다.

scalefs는 파일을 생성하면 생성된 inode 만큼 메모리를 소모하는 구조이므로 memory leak이 문제인지 메모리 자체가 부족한 것인지는 확인해야 할 것으로 보입니다.

MadPlayer commented 2 years ago

https://github.com/MadPlayer/mvcc-os/tree/apply-mvrlu 에서 작업중입니다.

MadPlayer commented 2 years ago

image 오류가 일어나기 직전의 free page 분포입니다. cpu number가 작은 쪽으로 free page가 몰려있는 상태입니다. port_alloc 부분을 수정해서 가능한지 확인하겠습니다.

MadPlayer commented 2 years ago

예상되는 mvrlu_free로 처리한 memory는 최종적으로 qp_thread에 의해 free 되기때문에 아래의 코드에 의하면 (kmfree 내부) https://github.com/bigsys-gnu/mvcc-os/blob/9a8eb43a0521677b83f1baace24337b158f8c105/os/sv6/scalefs/kernel/kmalloc.cc#L189-L197

현재 메모리를 해제하는 cpu의 freelist로 반환합니다. 결국 mvrlu로 괸리되는 모든 memory는 해제되면 cpu 0의 freelist로 가게된다는 결론을 얻을 수 있습니다. (qp_thread가 cpu 0으로 할당되어 있기 때문에)

bigsys-gnu commented 2 years ago

예상되는 mvrlu_free로 처리한 memory는 최종적으로 qp_thread에 의해 free 되기때문에 아래의 코드에 의하면 (kmfree 내부)

https://github.com/bigsys-gnu/mvcc-os/blob/9a8eb43a0521677b83f1baace24337b158f8c105/os/sv6/scalefs/kernel/kmalloc.cc#L189-L197

현재 메모리를 해제하는 cpu의 freelist로 반환합니다.

결국 mvrlu로 괸리되는 모든 memory는 해제되면 cpu 0의 freelist로 가게된다는 결론을 얻을 수 있습니다.

(qp_thread가 cpu 0으로 할당되어 있기 때문에)

그럼 다른 코어의 freelist가 소진되어 메모리 할당시 성능 병목이 될수도 있겠네요?

MadPlayer commented 2 years ago

그럼 다른 코어의 freelist가 소진되어 메모리 할당시 성능 병목이 될수도 있겠네요?

kbench를 실제 하드웨어에서 실행해도 같은 결과가 나오는지 확인해봐야 할 것으로 보입니다.

qemu user level에 vmimbalbench라는 것을 실행하면 page cycle을 사용하는 것을 볼 수 있었습니다.

bigsys-gnu commented 2 years ago

https://github.com/bigsys-gnu/mvcc-os/blob/9a8eb43a0521677b83f1baace24337b158f8c105/os/sv6/scalefs/kernel/scalefs.cc#L396-L409

chainhash에 mvrlu를 적용해서 scalefs의 작동을 테스트하고 있습니다. 주로 위의 assert를 패스하지 못하는 문제가 있습니다. image

assert( ) 발생할때 어떤 함수에서 delete_mnum_inode_safe( ) 호출했는지는 찾아보진 않았죠? mnum_to_inum 변수를 mvrlu 적용하지 않으면 문제는 없죠? 연산 ordering이 반드시 지켜져야 하는 부분에는 적용할 수 있을지 좀더 살펴봐야 겠네요.

위 오류는 mailbench-ben을 실행한 후에 확인한 것입니다. 원인은 memory leak 문제로 보입니다. 확인하는 방법은 Ctrl+f 를 연타해서 free page 수가 지속적으로 줄어들기만 하는 것을 확인할 수 있었습니다.

scalefs는 파일을 생성하면 생성된 inode 만큼 메모리를 소모하는 구조이므로 memory leak이 문제인지 메모리 자체가 부족한 것인지는 확인해야 할 것으로 보입니다.

MadPlayer commented 2 years ago

scalefs 적용

transaction info chainhash에만 적용하고 실행하면 dbench, lfs-largefile, lfs-smallfile, mailbench, filebench 등이 작동하는 것을 확인했습니다.

transaction info chainhash에만 mvrlu를 적용하여 20 core에서 kbench 실행 후 문제가 없으면 이슈 추가하겠습니다.

bigsys-gnu commented 2 years ago

scalefs 적용

  • inode to mnode
  • mnode to inode
  • transaction info chainhash 20 core에서 실행시 kbench 오류나며 비정상 종료되는 문제가 있습니다. 그리고 대부분의 benchmark가 inode mnode mapping에서 sanity 문제로 종료합니다.

transaction info chainhash에만 적용하고 실행하면 dbench, lfs-largefile, lfs-smallfile, mailbench, filebench 등이 작동하는 것을 확인했습니다.

transaction info chainhash에만 mvrlu를 적용하여 20 core에서 kbench 실행 후 문제가 없으면 이슈 추가하겠습니다.

kbench 실행은 관련이 없는거 아니에요?

transaction info chainhash 에만 적용하는 경우 대략적인 성능은 어떻던가요?

MadPlayer commented 2 years ago

kbench 실행은 관련이 없는거 아니에요?

kbench의 mvrlu가 kernel과 결합되어 있습니다.

transaction info chainhash 에만 적용하는 경우 대략적인 성능은 어떻던가요?

비교해보지는 않았습니다. 비교 후에 올리겠습니다.