시스템의 메모리가 부족하면 디스크 IO 사용량이 매우 높을 수 있다는 것을 발견했습니다.
프로세스가 많은 것 같습니다.읽다하드 드라이브에 문제가 있습니다( htop
아래 출력 확인). 너무 많은 메모리를 사용하는 프로세스를 종료하면 시스템에 일부 메모리를 확보하십시오. IO 사용량이 정상 상태로 떨어집니다.
시스템에 메모리가 충분하지 않을 때까지 많은 양의 메모리를 소비하는 프로그램을 작성하면 문제가 재현될 수 있습니다. 실행 중인 프로그램을 종료하면 모든 것이 정상으로 돌아갑니다.
나는 운영 체제의 스와핑 메커니즘을 알고 있습니다. 하지만 프로세스 전반에 걸쳐 스왑이 사용되지 않는 것 같습니다.(아래에서 확인 free
하고 vmstat
출력하세요)
❯ free -h
total used free shared buff/cache available
Mem: 859Mi 692Mi 60Mi 25Mi 106Mi 36Mi
Swap: 0B 0B 0B
❯ htop
PID RES SHR CPU% MEM% TIME+ DISK READ DISK WRITE DISK R/W Command
6386 37316 5380 0.7 4.2 10:40.07 14.96 M/s 0.00 B/s 14.96 M/s ahdbserver-1.3.2-SNAPSH
23252 17880 15748 0.0 2.0 0:01.24 7.91 M/s 0.00 B/s 7.91 M/s postgres -D /var/lib/po
29428 400 0 0.0 0.0 0:02.63 3.36 M/s 2.63 K/s 3.36 M/s sgagent -d
2369 197M 0 0.0 23.0 0:01.00 1.86 M/s 0.00 B/s 1.86 M/s java -jar memtest-1.0-S
24596 10820 0 0.0 1.2 0:59.53 694.74 K/s 0.00 B/s 694.74 K/s frps -c frps.ini
22901 122M 0 2.0 14.2 1:15.23 644.74 K/s 0.00 B/s 644.74 K/s srcds_linux -game dod -
8735 2016 52 0.7 0.2 1:46.21 344.74 K/s 0.00 B/s 344.74 K/s htop
2959 4664 176 0.0 0.5 15:35.06 318.42 K/s 0.00 B/s 318.42 K/s tmux
23265 18160 14344 0.0 2.1 0:01.30 286.84 K/s 0.00 B/s 286.84 K/s postgres: 11/main: post
23264 7036 3992 0.0 0.8 0:00.03 78.95 K/s 0.00 B/s 78.95 K/s postgres: 11/main: Time
23262 7160 4116 0.0 0.8 0:00.04 71.05 K/s 0.00 B/s 71.05 K/
❯ vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 68588 2096 103156 0 0 28436 0 1787 4288 2 8 79 12 0
0 1 0 57564 920 115364 0 0 24604 86 1676 3811 2 4 81 14 0
0 0 0 70252 1156 102360 0 0 31750 0 1794 4337 3 8 75 15 0
1 0 0 68632 2776 101380 0 0 38570 16 2139 4879 2 11 67 19 0
0 0 0 67656 892 104940 0 0 29356 14 1706 3936 3 5 77 15 0
0 0 0 68596 372 103368 0 0 50684 0 2324 5078 3 11 70 16 0
0 0 0 69596 268 102512 0 0 35688 38 1890 4282 2 8 76 15 0
0 1 0 69368 172 102540 0 0 35726 54 1877 4458 2 9 71 19 0
0 1 0 69684 1912 100916 0 0 28724 0 1759 4235 3 7 74 16 0
0 0 0 74380 768 97076 0 0 21198 0 1484 3762 2 5 80 13 0
❯ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 10 (buster)
Release: 10
Codename: buster
이유는 무엇입니까?
답변1
iotop
어떤 프로세스가 읽고 있는지 알려줄 것입니다.
일반적으로 문제는 캐시 부족으로 인해 발생합니다.
프로세스가 동일한 파일을 계속해서 순차적으로 읽는다고 가정하고 이것이 여유 메모리에 적합합니다. 그러면 I/O가 발생하지 않습니다. 모든 I/O 요청은 디스크 캐시에 의해 충족됩니다.
그러나 파일의 90%만 여유 메모리에 맞는 경우(예: 여유 메모리가 너무 작기 때문에) 갑자기전혀이는 캐싱 알고리즘이 최근에 가장 적게 사용된 것을 사용하기 때문입니다. 처음 90%는 메모리에 맞지만 마지막 10%를 읽을 때 처음 10%는 최근에 가장 적게 사용되었으므로 플러시됩니다. 마지막 10% 공간.
처음 10%를 다시 읽으면 다음 10%는 최근에 가장 적게 사용된 것이므로 플러시됩니다. 등.
정확한 상황이 아닐 수도 있지만 프로세스가 다른 파일의 다른 부분을 계속해서 읽어 유사한 결과를 제공할 수도 있습니다.
답변2
디스크 캐시만 메모리에서 지울 수 있는 것은 아닙니다.
커널은 실행 중인 애플리케이션의 페이지를 제거하고 현재 실행 중인 애플리케이션만 남길 수 있습니다. 이는 많은 코드를 실행해야 하는 "두꺼운" 애플리케이션에 대해 많은 IO를 생성할 수 있습니다.