티스토리 뷰
운영체제에는 가상메모리라는 개념이 존재하고, 물리메모리가 부족하면 디스크에 저장을 해서 부족한 메모리를 커버한다. 그래도 부족하면 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 해보도록 하자.
'OS > linux' 카테고리의 다른 글
[centos] kinit client 미설치 상황일때 설치방법 (0) | 2023.07.20 |
---|---|
[rsync] remote 서버에 파일을 복사하기 (0) | 2023.04.24 |
snap install 실패 문제 - system does not fully support snapd (0) | 2022.08.11 |
[명령어] 파일 생성일 기준으로 이전 파일 지우기 - 리눅스 쉘 명령 (0) | 2021.11.26 |
리눅스에서 PC로 파일옮길때 유용한 팁 - SimpleHTTPServer (0) | 2021.11.25 |