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 압축/해제

git pull 을 했더니 branch가 갈라지는 경우