티스토리 뷰

반응형

운영체제에는 가상메모리라는 개념이 존재하고, 물리메모리가 부족하면 디스크에 저장을 해서 부족한 메모리를 커버한다. 그래도 부족하면 os 에서는 일부 프로세스를 강제로 kill 하는 상황이 발생되며, 의도치 않게 데몬이 죽는 케이스가 존재한다.

메모리 부족해서 프로세스가 kill 되었는지 확인하는 방법은 dmseg 커맨드를 쳐서 확인해보면, killed process 라는 정보를 확인할 수 있다. 그런데 모니터링 도구를 이용해 보면 서버에는 메모리 여유가 존재하는데 프로세스가 죽는 경우가 생길때가 있는데 이때는 swap 사용을 확인해보자.

$ dmseg -H 
...
[  +0.000002] [19271]   500 19271   740064    16066     182        0             0 java
[  +0.000001] [19438]   500 19438    28331       52      13        0             0 sh
[  +0.000001] Out of memory: Kill process 14231 (java) score 101 or sacrifice child
[  +0.001374] Killed process 14231 (java), UID 500, total-vm:19160220kB, anon-rss:7071588kB, file-rss:0kB, shmem-rss:0kB
[  +0.004696] java invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
[  +0.000004] java cpuset=/ mems_allowed=0-1
[  +0.000003] CPU: 13 PID: 14828 Comm: java Not tainted 3.10.0-1160.71.1.el7.x86_64 #1
[  +0.000001] Hardware name: HPE ProLiant DL360 Gen10/ProLiant DL360 Gen10, BIOS U32 03/11/2021
[  +0.000001] Call Trace:
[  +0.000006]  [<ffffffff9d3865c9>] dump_stack+0x19/0x1b
[  +0.000004]  [<ffffffff9d381668>] dump_header+0x90/0x229
[  +0.000004]  [<ffffffff9cd06ac2>] ? ktime_get_ts64+0x52/0xf0
[  +0.000003]  [<ffffffff9cd5e17f>] ? delayacct_end+0x8f/0xb0
[  +0.000004]  [<ffffffff9cdc25cd>] oom_kill_process+0x2cd/0x490
[  +0.000002]  [<ffffffff9cdc1fbd>] ? oom_unkillable_task+0xcd/0x120
[  +0.000002]  [<ffffffff9cdc2cba>] out_of_memory+0x31a/0x500
[  +0.000003]  [<ffffffff9cdc98b4>] __alloc_pages_nodemask+0xad4/0xbe0
[  +0.000003]  [<ffffffff9ce1cc69>] alloc_pages_vma+0xa9/0x200
[  +0.000004]  [<ffffffff9cdf6887>] handle_mm_fault+0xcb7/0xfb0
[  +0.000003]  [<ffffffff9d394653>] __do_page_fault+0x213/0x500
[  +0.000002]  [<ffffffff9d394975>] do_page_fault+0x35/0x90
[  +0.000002]  [<ffffffff9d390778>] page_fault+0x28/0x30
[  +0.000001] Mem-Info:
[  +0.000006] active_anon:14618014 inactive_anon:976388 isolated_anon:0
 active_file:0 inactive_file:0 isolated_file:50
 unevictable:0 dirty:0 writeback:0 unstable:0
 slab_reclaimable:40812 slab_unreclaimable:53034
 mapped:344 shmem:221 pagetables:44282 bounce:0
 free:41220 free_pcp:488 free_cma:0
[  +0.000003] Node 0 DMA free:15900kB min:4kB low:4kB high:4kB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15988kB managed:15900kB m
[  +0.000005] lowmem_reserve[]: 0 2475 31659 31659

원인확인

free -m 명령어를 써보면 메모리 관련 정보를 알수 있는데, 분명 메모리의 free 가 46기가나 존재하는데, 희안하게 스왑의 사용률이 유난히 높은 특이한 상황이었다. 특히 모니터링도구를 보면 스왑사용이 100% 사용하면서 프로세스가 죽어버린걸 보면 스왑여유가 없으면 메모리가 부족하다고 판단하고, 떠있는 프로세스중 일부를 죽여버린걸로 보인다. (좀 특이한 상황이긴하다)

$ free -m
              total        used        free      shared  buff/cache   available
Mem:          63911       15609       46970           0        1331       48045
Swap:          4096        3307         789

 

해결방법

이렇게 메모리 여유는 있는데, 스왑만 희안하게 사용률이 높다면 스왑을 초기화 해주는걸로 해결이 가능하다.

참고로 시간은 꽤 걸릴수 있다. 나같은 경우 15분 정도 걸린것 같다. swapoff 를 하면 Swap 의 total, used 가 같이 점점 낮아지다가 0이 되고, 다시 swapon 을 하면  total 만 초기값으로 구성되고 used 는 0으로 확인이 된다.

# 스왑 off
sudo /sbin/swapoff -a

# 스왑 on
sudo /sbin/swapon -a

 

swapoff , on 했을때 메모리의 변화를 보면, 아래와 같다. 

## swapoff 전상태
$ free -m
              total        used        free      shared  buff/cache   available
Mem:          63911       15609       46970           0        1331       48045
Swap:          4096        3307         789


## swapoff 가 진행중임
$ free -m 
              total        used        free      shared  buff/cache   available
Mem:          63911       15477       45699           1        2734       48175
Swap:          2093        2093           0

## swapoff 가 끝났음
$ free -m 
              total        used        free      shared  buff/cache   available
Mem:          63911       16483       44358           3        3069       47168
Swap:             0           0           0

## swapon 했음
$ free -m 
              total        used        free      shared  buff/cache   available
Mem:          63911       16486       44353           3        3070       47164
Swap:          4096           0        4096

모니터링을 했을때 메모리 여유는 있는데, 프로세스가 자꾸 죽는상황이 발생되면 Swap 상태를 확인후 clear 해보도록 하자.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함