我以为我已经掌握了 Linux 中的内存,但是这个问题让我对自己产生了怀疑。
我有一台运行 Proxmox 5.4-13 的服务器,上面有一个运行 Ubuntu 16.04 的容器。此容器运行各种进程,包括 Apache、PHP-FPM、Memcached、Redis 以及带有无头 Chrome 的 Puppeteer。该容器已分配大约 100Gb 的 RAM。
似乎自从我们开始更多地使用 Puppeteer/headless chrome 以来,我们就看到了某种内存泄漏 - 或者至少内存被用完了,然后没有被内核释放?这可能只是巧合。服务器使用的内存慢慢增长。我无法确定是什么在使用内存。停止或终止服务不会考虑使用的内存。重新启动容器会使一切恢复正常,然后在几周的时间内再次缓慢增长。
在撰写本文时,已使用近 30Gb 的内存(自上次重启以来已过去一周)。
$ free -m
total used free shared buff/cache available
Mem: 102400 28128 63454 2562 10817 74271
如果我运行 ps_mem (https://github.com/pixelb/ps_mem) 则返回我的进程总共使用了 5.2Gb。运行 top/htop 不会显示哪些进程正在使用内存。
Private + Shared = RAM used Program
292.0 KiB + 66.5 KiB = 358.5 KiB autossh (3)
468.0 KiB + 104.5 KiB = 572.5 KiB su
432.0 KiB + 160.5 KiB = 592.5 KiB agetty (3)
528.0 KiB + 222.0 KiB = 750.0 KiB sh (6)
516.0 KiB + 354.5 KiB = 870.5 KiB master
484.0 KiB + 390.5 KiB = 874.5 KiB pickup
856.0 KiB + 46.5 KiB = 902.5 KiB systemd-logind
572.0 KiB + 360.5 KiB = 932.5 KiB qmgr
852.0 KiB + 267.5 KiB = 1.1 MiB dbus-daemon
816.0 KiB + 308.5 KiB = 1.1 MiB cron (3)
1.3 MiB + 95.5 KiB = 1.4 MiB ntpd
940.0 KiB + 619.0 KiB = 1.5 MiB sudo (2)
1.4 MiB + 164.5 KiB = 1.5 MiB pgbouncer
1.8 MiB + 168.5 KiB = 2.0 MiB atop
1.0 MiB + 1.0 MiB = 2.1 MiB polkitd
2.1 MiB + 25.5 KiB = 2.1 MiB rsyslogd
1.2 MiB + 1.0 MiB = 2.2 MiB accounts-daemon
2.1 MiB + 426.5 KiB = 2.6 MiB smtpd
2.1 MiB + 635.0 KiB = 2.7 MiB (sd-pam) (2)
2.7 MiB + 317.0 KiB = 3.0 MiB sftp-server (14)
1.7 MiB + 1.3 MiB = 3.0 MiB zabbix_agentd (6)
2.1 MiB + 2.1 MiB = 4.2 MiB systemd (3)
6.0 MiB + 880.5 KiB = 6.8 MiB ssh (3)
7.1 MiB + 1.2 MiB = 8.2 MiB bash (4)
3.9 MiB + 7.5 MiB = 11.5 MiB sshd (15)
13.0 MiB + 846.5 KiB = 13.8 MiB unattended-upgr
13.4 MiB + 1.1 MiB = 14.5 MiB supervisord
62.4 MiB + 20.5 KiB = 62.4 MiB redis-server
22.9 MiB + 57.0 MiB = 79.9 MiB systemd-journald
77.2 MiB + 24.4 MiB = 101.5 MiB apache2 (5)
102.5 MiB + 9.2 MiB = 111.6 MiB php7.3 (5)
111.6 MiB + 34.3 MiB = 145.9 MiB phantomjs (4)
521.2 MiB + 148.5 KiB = 521.4 MiB memcached
4.1 GiB + 69.9 MiB = 4.2 GiB php-fpm7.3 (20)
---------------------------------
5.2 GiB
=================================
我如何确定什么正在使用内存?
编辑1:
$ mount | grep tmpfs
none on /dev type tmpfs (rw,relatime,size=492k,mode=755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
tmpfs on /run/user/33 type tmpfs (rw,nosuid,nodev,relatime,size=13191772k,mode=700,uid=33,gid=33)
tmpfs on /run/user/2001 type tmpfs (rw,nosuid,nodev,relatime,size=13191772k,mode=700,uid=2001,gid=2001)