Linux
如何找出記憶體洩漏?
我在 Digitalocean 上執行 Ubuntu 14.04 來託管我的部落格。我正在使用 HHVM + nginx + MySQL。每隔幾個小時(~12h),沒有更多的記憶體,nginx 會拋出 502 錯誤。
我檢查了最後 10 分鐘的記憶體使用情況,
free -m
這就是我得到的:total used free shared buffers cached Mem: 994 714 279 29 20 235 -/+ buffers/cache: 458 535 Swap: 0 0 0
total used free shared buffers cached Mem: 994 715 278 29 20 235 -/+ buffers/cache: 459 534 Swap: 0 0 0
total used free shared buffers cached Mem: 994 722 271 29 20 240 -/+ buffers/cache: 461 532 Swap: 0 0 0
total used free shared buffers cached Mem: 994 729 264 29 20 240 -/+ buffers/cache: 469 524 Swap: 0 0 0
total used free shared buffers cached Mem: 994 725 268 29 20 240 -/+ buffers/cache: 464 529 Swap: 0 0 0
那麼我怎樣才能弄清楚記憶體洩漏的來源呢?
htop
輸出:PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command 2107 root 20 0 26284 2528 1408 R 0.7 0.2 0:00.47 htop 1002 mysql 20 0 737M 72680 7332 S 0.0 7.1 0:00.99 /usr/sbin/mysqld 1088 redis 20 0 36996 7256 876 S 0.0 0.7 0:06.46 /usr/bin/redis-server 127.0.0.1:6379 925 mysql 20 0 737M 72680 7332 S 0.0 7.1 0:17.87 /usr/sbin/mysqld 949 mysql 20 0 737M 72680 7332 S 0.0 7.1 0:00.21 /usr/sbin/mysqld 1 root 20 0 33492 2768 1400 S 0.0 0.3 0:01.30 /sbin/init 343 root 20 0 19608 648 460 S 0.0 0.1 0:00.12 upstart-udev-bridge --daemon 351 messagebu 20 0 39228 1292 884 S 0.0 0.1 0:00.07 dbus-daemon --system --fork 354 root 20 0 51476 1552 952 S 0.0 0.2 0:00.05 /lib/systemd/systemd-udevd --daemon 399 root 20 0 43452 1756 1396 S 0.0 0.2 0:00.00 /lib/systemd/systemd-logind 427 syslog 20 0 249M 1388 788 S 0.0 0.1 0:00.01 rsyslogd 428 syslog 20 0 249M 1388 788 S 0.0 0.1 0:00.00 rsyslogd 429 syslog 20 0 249M 1388 788 S 0.0 0.1 0:00.02 rsyslogd 426 syslog 20 0 249M 1388 788 S 0.0 0.1 0:00.03 rsyslogd 452 root 20 0 15408 648 320 S 0.0 0.1 0:00.05 upstart-file-bridge --daemon 672 root 20 0 15392 692 332 S 0.0 0.1 0:00.05 upstart-socket-bridge --daemon 810 root 20 0 15820 928 768 S 0.0 0.1 0:00.00 /sbin/getty -8 38400 tty4 816 root 20 0 15820 928 768 S 0.0 0.1 0:00.00 /sbin/getty -8 38400 tty5 821 root 20 0 15820 932 768 S 0.0 0.1 0:00.00 /sbin/getty -8 38400 tty2 822 root 20 0 15820 924 768 S 0.0 0.1 0:00.00 /sbin/getty -8 38400 tty3 825 root 20 0 15820 932 768 S 0.0 0.1 0:00.00 /sbin/getty -8 38400 tty6 855 root 20 0 61364 3008 2328 S 0.0 0.3 0:00.03 /usr/sbin/sshd -D 858 root 20 0 4368 656 512 S 0.0 0.1 0:00.00 acpid -c /etc/acpi/events -s /var/run/acpid.socket 859 root 20 0 23656 1024 768 S 0.0 0.1 0:00.03 cron 861 daemon 20 0 19140 160 0 S 0.0 0.0 0:00.00 atd 894 whoopsie 20 0 327M 3584 2424 S 0.0 0.4 0:00.00 whoopsie 896 whoopsie 20 0 327M 3584 2424 S 0.0 0.4 0:00.00 whoopsie 873 whoopsie 20 0 327M 3584 2424 S 0.0 0.4 0:00.00 whoopsie 1170 www-data 20 0 1541M 390M 91108 S 0.0 39.3 0:00.59 /usr/bin/hhvm --config /etc/hhvm/php.ini --config /etc/hhvm/server.ini --user www-data --mode daemo 1357 www-data 20 0 1541M 390M 91108 S 0.0 39.3 0:23.19 /usr/bin/hhvm --config /etc/hhvm/php.ini --config /etc/hhvm/server.ini --user www-data --mode daemo 1437 www-data 20 0 1541M 390M 91108 S 0.0 39.3 0:12.09 /usr/bin/hhvm --config /etc/hhvm/php.ini --config /etc/hhvm/server.ini --user www-data --mode daemo 1438 www-data 20 0 1541M 390M 91108 S 0.0 39.3 0:19.50 /usr/bin/hhvm --config /etc/hhvm/php.ini --config /etc/hhvm/server.ini --user www-data --mode daemo 1439 www-data 20 0 1541M 390M 91108 S 0.0 39.3 0:14.87 /usr/bin/hhvm --config /etc/hhvm/php.ini --config /etc/hhvm/server.ini --user www-data --mode daemo 1440 www-data 20 0 1541M 390M 91108 S 0.0 39.3 0:14.93 /usr/bin/hhvm --config /etc/hhvm/php.ini --config /etc/hhvm/server.ini --user www-data --mode daemo 1441 www-data 20 0 1541M 390M 91108 S 0.0 39.3 0:13.68 /usr/bin/hhvm --config /etc/hhvm/php.ini --config /etc/hhvm/server.ini --user www-data --mode daemo 1442 www-data 20 0 1541M 390M 91108 S 0.0 39.3 0:11.29 /usr/bin/hhvm --config /etc/hhvm/php.ini --config /etc/hhvm/server.ini --user www-data --mode daemo 1443 www-data 20 0 1541M 390M 91108 S 0.0 39.3 0:16.50 /usr/bin/hhvm --config /etc/hhvm/php.ini --config /etc/hhvm/server.ini --user www-data --mode daemo 1444 www-data 20 0 1541M 390M 91108 S 0.0 39.3 0:17.66 /usr/bin/hhvm --config /etc/hhvm/php.ini --config /etc/hhvm/server.ini --user www-data --mode daemo 916 www-data 20 0 1541M 390M 91108 S 0.0 39.3 2:25.37 /usr/bin/hhvm --config /etc/hhvm/php.ini --config /etc/hhvm/server.ini --user www-data --mode daemo 945 mysql 20 0 737M 72680 7332 S 0.0 7.1 0:00.18 /usr/sbin/mysqld 946 mysql 20 0 737M 72680 7332 S 0.0 7.1 0:00.73 /usr/sbin/mysqld 947 mysql 20 0 737M 72680 7332 S 0.0 7.1 0:00.23 /usr/sbin/mysqld 948 mysql 20 0 737M 72680 7332 S 0.0 7.1 0:00.22 /usr/sbin/mysqld 950 mysql 20 0 737M 66360 7332 S 0.0 6.5 0:00.26 /usr/sbin/mysqld 951 mysql 20 0 737M 66360 7332 S 0.0 6.5 0:00.23 /usr/sbin/mysqld 952 mysql 20 0 737M 66360 7332 S 0.0 6.5 0:00.21 /usr/sbin/mysqld 955 mysql 20 0 737M 66360 7332 S 0.0 6.5 0:00.19 /usr/sbin/mysqld 956 mysql 20 0 737M 66360 7332 S 0.0 6.5 0:00.17 /usr/sbin/mysqld 1003 mysql 20 0 737M 66360 7332 S 0.7 6.5 0:01.61 /usr/sbin/mysqld 1004 mysql 20 0 737M 66360 7332 S 0.0 6.5 0:00.10 /usr/sbin/mysqld 1005 mysql 20 0 737M 66360 7332 S 0.0 6.5 0:00.00 /usr/sbin/mysqld 1168 mysql 20 0 737M 66360 7332 S 0.0 6.5 0:00.00 /usr/sbin/mysqld 1173 mysql 20 0 737M 66360 7332 S 0.0 6.5 0:03.08 /usr/sbin/mysqld 1202 mysql 20 0 737M 66360 7332 S 0.0 6.5 0:03.37 /usr/sbin/mysqld 1445 mysql 20 0 737M 66360 7332 S 0.0 6.5 0:02.37 /usr/sbin/mysqld 1446 mysql 20 0 737M 66360 7332 S 0.0 6.5 0:03.37 /usr/sbin/mysqld 957 memcache 20 0 357M 42368 876 S 0.0 4.2 0:00.96 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 958 memcache 20 0 357M 42368 876 S 0.0 4.2 0:00.97 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 959 memcache 20 0 357M 42368 876 S 0.0 4.2 0:00.91 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 960 memcache 20 0 357M 42368 876 S 0.0 4.2 0:00.94 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 961 memcache 20 0 357M 42368 876 S 0.0 4.2 0:00.00 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 941 memcache 20 0 357M 42368 876 S 0.0 4.2 0:04.53 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 962 root 20 0 90268 1440 228 S 0.0 0.1 0:00.00 nginx: master process /usr/sbin/nginx 963 www-data 20 0 91172 2840 1072 S 0.0 0.3 0:01.47 nginx: worker process 1064 root 20 0 25344 1556 1276 S 0.0 0.2 0:00.04 /usr/lib/postfix/master 1069 postfix 20 0 27460 1516 1232 S 0.0 0.1 0:00.00 qmgr -l -t unix -u 1091 redis 20 0 36996 7256 876 S 0.0 0.7 0:00.00 /usr/bin/redis-server 127.0.0.1:6379 1092 redis 20 0 36996 7256 876 S 0.0 0.7 0:00.00 /usr/bin/redis-server 127.0.0.1:6379 1151 root 20 0 15820 932 768 S 0.0 0.1 0:00.01 /sbin/getty -8 38400 tty1 1859 postfix 20 0 27408 1488 1212 S 0.0 0.1 0:00.00 pickup -l -t unix -u -c 1984 root 20 0 103M 4220 3224 S 0.0 0.4 0:00.11 sshd: root@pts/0 2054 root 20 0 22764 3876 1676 S 0.0 0.4 0:00.05 -bash
根據您提供的資訊,沒有什麼可看的。你
free -m
只是表明你只使用了大約一半的記憶體。您是否檢查過您的 HHVM 和 nginx 日誌以查看這是否是實際問題?您可以製作一個像這樣的小腳本,它將每 30 秒(或更多)獲取 ps aux 的輸出並將其附加到文件中。讓它在後台執行一段時間,然後分析記憶體輸出。我認為可以在文件上使用各種 UNIX 工具以及之後的輸出,以獲得很好的分析機會。
腳本可能如下所示:
while [ true ] do printf "\n\n" >> /root/psaux_analysis echo "--------------------------------------" >> /root/psaux_analysis date >> /root/psaux_analysis echo "--------------------------------------" >> /root/psaux_analysis printf "\n" >> /root/psaux_analysis ps aux >> /root/psaux_analysis sleep 30; done
這將為您提供類似於以下內容的輸出:
-------------------------------------- Mon Jun 16 07:44:03 UTC 2014 -------------------------------------- USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 2028 584 ? Ss Mar12 1:08 init [2] root 2 0.0 0.0 0 0 ? S Mar12 0:00 [kthreadd/146] root 3 0.0 0.0 0 0 ? S Mar12 0:00 [khelper/146] daemon 313 0.0 0.0 1804 512 ? Ss Mar12 0:00 /sbin/portmap daemon 528 0.0 0.0 2156 304 ? Ss Mar12 0:00 /usr/sbin/atd 104 551 0.0 0.0 2580 240 ? Ss Mar12 0:00 /usr/bin/dbus-daemon --system root 560 0.0 0.0 2288 732 ? Ss Mar12 0:28 /usr/sbin/cron root 727 0.0 0.0 29576 4128 ? Sl Mar12 38:12 /usr/bin/python /usr/bin/fail2ban-server -b -s /var/run/fail2ban/fail2ban.sock ...