メモリリークを見つける方法は? [閉鎖]

メモリリークを見つける方法は? [閉鎖]

私はブログをホストするためにDigitaloceanでUbuntu 14.04を実行しています。私はHHVM + nginx + MySQLを使用しています。数時間(〜12時間)ごとにRAMが残っておらず、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

答え1

ご提供いただいた情報には見どころが多くありません。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
...

関連情報