为什么“RES 总和”不等于“已使用的内存 + 已使用的交换”(Ubuntu 18.04)?

为什么“RES 总和”不等于“已使用的内存 + 已使用的交换”(Ubuntu 18.04)?

我正在尝试在具有 1GB RAM 的 VPS 服务器(Digital Ocean)上托管 java8 UI 应用程序。 Java 启动时-Xms600m -Xmx600m(启动和最大内存使用量)。它还运行 VNC + mate-core。我的假设是 400m 对于非 java 人员来说应该足够了,1GB对我来说也可以。

但我遇到了奇怪的记忆问题。一段时间后,系统no swapswappiness=0CPU 使用率达到 90%,kswapd0系统冻结。

我添加了 500MB 的交换空间。swappiness=0现在同样top表明几乎所有物理内存都被使用,加上整个交换区也被使用。我试图检查是什么消耗了如此多的内存,并看到topRES 的总和在附近730M- 似乎与预期的一样。

根据我的理解 - 根本不需要这样的内存使用交换,但实际上整个交换500М似乎都被消耗了 - 因此总内存消耗(物理+交换)似乎接近,1400M并且我仍然遇到奇怪的冻结,在这些时刻kswapd0是第一个在top.

所以 ...

  • 我在这里犯了什么错?
  • 为什么“已使用的内存 + 已使用的交换”比“RES 之和”高两倍?
  • 为什么 的 Swap 使用率如此之高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 进程对内存使用量的估计 -actual=~960MBexpected=~650MB.这意味着 1GB 的整个物理地址空间可能会被唯一的 java 进程占用。

为什么“已使用的内存 + 已使用的交换”比“RES 之和”高两倍?

因为,正如我现在从 中看到的top,某些进程占用的空间SWAP比 in多,并且在我的特定情况下,导致总体内存使用量在和RES之间的分布约为 50/50RESSWAP

为什么 swappiness=0 时 Swap 使用率这么高?

因为实际内存使用率确实很高,进程无法放入物理内存。

相关内容