1GB RAM을 갖춘 VPS 서버(Digital Ocean)에서 java8 UI 애플리케이션을 호스팅하려고 합니다. Java 시작 -Xms600m -Xmx600m
(시작 및 최대 메모리 사용량). 또한 VNC + 메이트 코어도 실행합니다. 내 가정은 400m가 Java가 아닌 사람들에게는 충분할 것이고 1GB
나에게도 괜찮다는 것입니다.
그런데 이상한 기억력 문제가 생겼어요. 얼마 후 시스템 no swap
의 swappiness=0
CPU 사용량이 90%에 도달하고 kswapd0
시스템이 정지됩니다.
500MB의 스왑 공간을 추가했습니다. 이제 거의 모든 물리적 메모리가 사용되었으며 전체 스왑 영역도 사용되었음을 보여 swappiness=0
줍니다 . top
무엇이 메모리를 그렇게 많이 소모하는지 확인해 보니 top
RES의 합이 대략 나와 있는 것을 보니 730M
예상한 대로인 것 같았습니다.
제가 이해한 바로는 이러한 메모리 사용량 스와핑이 전혀 필요하지 않지만 실제로는 전체 스왑이 500М
소비된 것 같습니다. 따라서 총 메모리 소비(물리적 + 스와핑)는 거의 비슷한 것으로 보이며 1400M
이 순간에도 여전히 이상하게 멈춥니다. kswapd0
첫 번째는 에 있습니다 top
.
그래서...
- 내가 여기서 무슨 실수를 했나요?
- "사용된 메모리 + 사용된 스왑"이 "RES 합계"보다 두 배 높은 이유는 무엇입니까?
- 스왑 사용량이 왜 그렇게 높나요
swappiness=0
?
top
"RES"로 정렬(@TooTee의 팁 뒤에 - SWAP 및 USED 열 추가, 즉 RES+SWAP)
top - 14:12:17 up 14:13, 2 users, load average: 1.40, 3.49, 2.99
Tasks: 115 total, 1 running, 78 sleeping, 0 stopped, 0 zombie
%Cpu(s): 17.6 us, 8.5 sy, 0.0 ni, 65.2 id, 0.2 wa, 0.0 hi, 0.2 si, 8.3 st
KiB Mem : 1009136 total, 66492 free, 881084 used, 61560 buff/cache
KiB Swap: 511996 total, 1056 free, 510940 used. 22580 avail Mem
PID VIRT RES SWAP USED SHR S %CPU %MEM TIME+ COMMAND
3271 3065936 690516 274056 964572 400 S 21.8 68.4 212:57.30 java
1348 298512 46952 78576 125528 6476 S 6.2 4.7 62:43.95 Xvnc4
883 496100 12328 2968 15296 7688 S 0.0 1.2 0:41.00 do-agent
3256 633796 9728 7912 17640 6132 S 1.0 1.0 3:47.81 mate-terminal
1475 544648 5100 5736 10836 3252 S 0.2 0.5 3:37.92 clock-applet
1 77684 2572 116 2688 532 S 0.0 0.3 0:11.74 systemd
1476 493176 2492 4580 7072 44 S 0.0 0.2 0:04.09 wnck-applet
1412 442048 2340 5208 7548 704 S 0.0 0.2 0:06.59 marco
1400 992492 1916 5924 7840 304 S 0.2 0.2 3:30.01 mate-settings-d
1100 111460 1828 440 2268 0 S 0.0 0.2 0:00.00 (sd-pam)
8684 23072 1644 0 1644 24 S 0.0 0.2 0:00.08 bash
409 80244 1268 1172 2440 1152 S 0.0 0.1 0:08.14 systemd-journal
8697 44552 1072 0 1072 388 R 0.2 0.1 0:07.14 top
1434 700512 1024 6876 7900 0 S 0.0 0.1 0:02.43 mate-panel
703 70756 584 524 1108 404 S 0.0 0.1 0:02.32 systemd-resolve
865 31748 512 224 736 436 S 0.0 0.1 0:00.89 cron
8585 107776 464 856 1320 300 S 0.2 0.0 0:00.81 sshd
1506 323368 408 1416 1824 0 S 0.0 0.0 0:00.04 polkit-mate-aut
891 287992 376 792 1168 288 S 0.0 0.0 0:04.66 accounts-daemon
1359 436920 356 7596 7952 0 S 0.0 0.0 0:00.49 mate-session
887 44640 312 780 1092 60 S 0.2 0.0 1:54.70 openvpn
892 263036 180 1112 1292 0 S 0.0 0.0 0:03.61 rsyslogd
1084 107776 176 844 1020 0 S 0.0 0.0 0:00.21 sshd
1231 107776 160 868 1028 0 S 0.0 0.0 0:10.07 sshd
1375 220776 72 716 788 0 S 0.0 0.0 0:00.05 at-spi2-registr
776 43564 48 944 992 0 S 0.0 0.0 0:00.62 systemd-udevd
678 71972 36 696 732 0 S 0.0 0.0 0:00.53 systemd-network
869 50188 36 716 752 0 S 0.0 0.0 0:00.40 dbus-daemon
1358 38572 36 376 412 0 S 0.0 0.0 0:00.10 vncconfig
860 70580 32 692 724 0 S 0.0 0.0 0:00.37 systemd-logind
889 170884 32 7816 7848 12 S 0.0 0.0 0:00.15 networkd-dispat
597 141924 24 576 600 0 S 0.0 0.0 0:00.33 systemd-timesyn
885 28332 24 192 216 0 S 0.0 0.0 0:00.00 atd
944 16412 24 124 148 0 S 0.0 0.0 0:00.00 agetty
925 72296 16 740 756 0 S 0.0 0.0 0:01.69 sshd
945 14888 16 112 128 0 S 0.0 0.0 0:00.04 agetty
1092 76772 4 1180 1184 4 S 0.0 0.0 0:00.03 systemd
1320 63764 4 484 488 4 S 0.0 0.0 0:00.00 sudo
1366 349216 4 784 788 4 S 0.0 0.0 0:00.00 at-spi-bus-laun
1449 281988 4 824 828 4 S 0.0 0.0 0:00.01 gvfs-gphoto2-vo
1460 267396 4 684 688 4 S 0.0 0.0 0:00.01 gvfs-goa-volume
1465 269200 4 696 700 4 S 0.0 0.0 0:00.01 gvfs-mtp-volume
2 0 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
답변1
지금까지 얻은 지식을 활용하여 내 자신의 질문에 답해 보겠습니다.
내가 여기서 무슨 실수를 했나요?
가장 큰 실수는 프로세스의 메모리 사용량이 RES
열에 반영된다고 가정하는 것입니다. 이는 실제로 USED
열에 반영되며 (= RES + SWAP)
기본 구성에서는 열이 top
표시되지 않습니다 USED
(이유가 궁금합니다). f
키를 입력하여 원하는 표시 열, 순서 및 정렬 순서를 구성합니다.
또 다른 주요 오류는 Java 프로세스의 메모리 사용량 추정입니다. 이는 1GB의 전체 물리적 주소 공간이 유일한 Java 프로세스에 의해 점유될 수 있음을 actual=~960MB
의미합니다 .expected=~650MB
"사용된 메모리 + 사용된 스왑"이 "RES 합계"보다 두 배 높은 이유는 무엇입니까?
이제 이 페이지에서 볼 수 있듯이 top
일부 프로세스는 에서보다 더 많은 공간을 차지하고 SWAP
내 특별한 경우에는 전체 메모리 사용량이 과 RES
에서 약 50/50으로 분할되었습니다.RES
SWAP
swappiness=0일 때 왜 스왑 사용량이 그렇게 높나요?
실제 메모리 사용량이 매우 높기 때문에 프로세스가 실제 메모리에 맞지 않습니다.