6월, 2018의 게시물 표시

OOM-Killer에게 이 프로세스는 죽이지 말라고 알려주는 방법

메모리가 부족한 Embedded Linux에서 OOM-Killer는 정말 골칫거리중의 하나입니다. Swap을 사용할 수 있다면 정말 좋겠지만, 보통은 그러기 힘듭니다. 일단 어떻게 해볼 수 있는 방법을 찾아서 기록으로 남겨둡니다. 차후 확인해볼 예정입니다. OOM Killer에서 해당 PID의 프로세스는 죽이지 말라는 명령입니다. 다만 실제 OOM-Killer 상황에서 이 프로세스를 죽이지 않을 경우 어떤일이 발생하는지 확인해봐야합니다. 메모리를 Access했지만 실제로 없는 메모리일 경우는 생각만해도 끔찍하죠. 메모리를 많이 사용하는 프로세스가 주 프로세스 외에 없을 경우에 OOM-Killer가 어떻게 동작할지도 확인해야할테구요. https://www.quora.com/How-can-I-protect-specific-Linux-processes-from-the-OOM-process-killer This means we can disable OOM killer on an individual process, if we know its PID, using the command below: # OOM_DISABLE on $PID echo -17 > /proc/$PID/oom_adj

usb-storage: page allocation failure: order:0, mode:0x20

https://access.redhat.com/solutions/90883 위 링크에서는 Red Hat Enterprise Linux 6 환경에서 발생한 문제 입니다만, 저는 Arm 9 계열 Embedded Linux 3.10.0 에서 발생한 문제입니다. USB-2에 16KBytes 단위로 루프를 돌며 딜레이 없이 최대 15GB까지 쓰다보니 엄청난 양의 page가 발생하였고, Free와 Cache를 오가는 메모리에 문제가 생겨서 page allocation failure 가 발생했을 것으로 추정하고 있습니다. 위 링크에서는 두가지 Workaround를 제공하고 있습니다. vm.min_free_kbytes 늘리기 : 정확한 수치는 제공하고 있지 않습니다만, 65535까지 늘려서 해결하였다는 포스팅이 제법 있습니다. 다만 아직 정확하게 파악하지 못해서 적용하지 않았습니다. vm.zone_reclaim_mode 이 0일 경우 1로 세팅 : linux v3.10.0 에는 이 기능이 없습니다. 그리하여 다른 방법을 찾아보던 중 다음과 같은 커널 패치를 찾았습니다. 어차피 USB-2의 속도로는 명령어 큐가 32가 되어도 충분하므로 256에서 32로 줄여도 무방하다고 합니다. https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/usb/storage/uas.c?id=e2875c33787ebda21aeecc1a9d3ff52b3aa413ec 최신 커널에서 해당 패치가 적용되어 있으므로 커널을 재컴파일 해서 올라보았으나  https://github.com/torvalds/linux/blob/master/drivers/usb/storage/uas.c#L912 동일한 문제가 발생합니다. 결국 이 기능 외에는 루프를 돌며 수GB를 쓰는 기능이 없으므로 아예 기능을 빼버렸습니다. 다만 이 기능이 꼭 필요하다면 loop에 딜...

이 블로그의 인기 게시물

WSL2 Ubuntu 20.04 및 네트워크 설정

리눅스 멀티코어를 사용하는 tar 압축/해제

WSL에 X-Window로 Terminator 설치하고 Minicom까지