오늘 회사 메일중에서 [RE] 가 엄청 붙어서 여기저기서 회신 해 대는 메일을 하나 보았다.
내용은 android binder를 open하고 mmap을 할 때 'NULL'이 return 된다는 것이다.
'NULL'이 return될 때 kernel log에는
"binder_mmap: 1077 63943000-63b41000 get_vm_area failed -12" 이 남아 있었다.
문제가 발생한 Model(Phone)은 이전에도(지금은 출시했다.) 이런 문제가 발생했었는데
vmalloc size를 늘려주면서 해결을 했었다.(물론 내가 늘린 것은 아니고...)
그런데, 또 문제가 발생한 것이다. 다시 vmalloc size를 늘려야 하는 것 인가?
vmalloc size를 늘리면 low memory쪽의 용량이 줄어드는데 side effect는 발생하지 않을 것 인가?
고민스럽다. 문제의 현상이 발생했을 때 vmallocinfo를 보았으면 좋았을텐데...
뭐~ 재현이라는 것이 호락하지 않으니 볼수도 없고..재현이 되면 참 좋은데...
다음 Model 개발에도 이런 문제가 발생할 수 있으니 미리 간략하게 정리라도 해 놓고 문제가 발생했을 때
kernel의 vmalloc information을 출력할 수 있는 방안을 생각해 놓자!
답변으로 보낸 메일을 수정하여 살짝 올려 놓자!
아래 binder의 mmap 함수에서 vm area를 얻지 못하는 것은
커널이 사용하는 1G 영역에서 커널 내부에서 사용할 가상 address 영역이
full이 되었거나 요청하는 size의 가상 address를 fragmentation으로 인해서
할당을 하지 못했기 되었기 때문일 것이다.(다른 이유가 또 있을까 잘 모르겠네)
지금 Model의 kernel은 HIGH Memory를 사용하고 있으며,
HIGH Memory에 4xxMB가 할당되어 있다.
첨부되어 있던 로그 파일에 확인한 것 입니다. 아래는 kernel log의 일부분입니다.
[ 0.000000] vmalloc : 0xxx000000 - 0xxx000000 ( 4xx MB)
[ 0.000000] lowmem : 0xx0000000 - 0xxx00000 ( 4xx MB)
아무래도 회사의 Model의 내용이니 살짝 주소나 크기에 변경을 가했다.
boot command로 vmalloc 을 설정하도록 되어 있으며, vmalloc을 설정할 경우에
vmalloc의 size가 HIGH Memory가 되며, 이 영역이 kernel 내부에서 할당할 수 있는
가상 address 영역이 된다.
vmallocinfo(/proc/vmallocinfo)를 확인하면 현재 kernel이 할당한 vm area를 볼 수 있다.
kernel vm의 상태를 확인하면 memory leakage로 인한 문제인지
일반적인 최대 사용량을 넘긴 것인지 추측할 수 있을 것이다.
가장 손쉬운 workaround로는 vmalloc size를 늘려주는 것이다.
vmalloc size는 늘리면 Normal zone(lowmem) 영역이 줄어들게 되어
다른 side effect (kernel 내부에서 Normal zone에서 memory를 할당할 때 메모리가 모자라는 현상)가
발생할 수가 있을 것 같다.
무엇보다 문제가 발생했을 때 postmortem debugging을 위해서 무엇인가를 남기는 방안을 생각 해 보자!
잊지말자!
댓글 없음:
댓글 쓰기