ここで、Rails アプリケーションを RedHat サーバーで実行しています。Passenger Standalone v3.0.19 を使用してサービスを提供しています。データベースはMySQLです。最近、一部の Passenger Application インスタンスが毎分ますます多くのメモリを消費し続けていることがわかりました。これらのインスタンスは実際には役に立ちません。(ページをリクエストすると、Passenger はこのインスタンスを使用する代わりに新しいインスタンスを生成します) そのようなインスタンスを手動で強制終了しようとしました (問題に対処する正しい方法ではないことはわかっています) が、数時間後に再び発生します。
これは、passenger-memory-stats で得たものです。
------- Apache processes --------
### Processes: 0
### Total private dirty RSS: 0.00 MB
---------- Nginx processes ----------
PID PPID VMSize Private Name
-------------------------------------
48881 1 27.6 MB 0.1 MB nginx: master process /home/myuser/.passenger/standalone/3.0.19-x86_64-ruby1.9.3-linux-gcc4.4.7-1002/nginx-1.2.6/sbin/nginx -c /tmp/passenger-standalone.48333/config -p /tmp/passenger-standalone.48333/
48882 48881 28.5 MB 0.7 MB nginx: worker process
### Processes: 2
### Total private dirty RSS: 0.78 MB
------- Passenger processes -------
PID VMSize Private Name
-----------------------------------
48841 207.3 MB 0.1 MB PassengerWatchdog
48844 1822.7 MB 1.7 MB PassengerHelperAgent
48846 247.2 MB 14.3 MB Passenger spawn server
48850 143.0 MB 0.5 MB PassengerLoggingAgent
63729 10006.3 MB 9097.2 MB Rack: /home/myuser/webapp/current
76631 999.0 MB 92.3 MB Rack: /home/myuser/webapp/current
これは乗客ステータスの出力です。
----------- General information -----------
max = 6
count = 1
active = 0
inactive = 1
Waiting on global queue: 0
----------- Application groups -----------
/home/myuser/webapp/current:
App root: /home/myuser/webapp/current
* PID: 76631 Sessions: 0 Processed: 15 Uptime: 51m 7s
明らかに、プロセス 63729 は Passenger によって管理されなくなりました。
次のコマンドを実行して、strace も使用しました。
strace -f -p 63729
私は得た:
[pid 63729] read(14, "\1\0\0\1\1\36\0\0\2\3def\0\0\0\10COUNT(*)\0\f?\0\25\0\0"..., 16384) = 63
[pid 63729] brk(0x234f2c000) = 0x234f2c000
[pid 63729] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3519, ...}) = 0
[pid 63729] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3519, ...}) = 0
[pid 63729] poll([{fd=14, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
[pid 63729] write(14, "\221\0\0\0\3SELECT COUNT(*) FROM `test_"..., 149) = 149
[pid 63729] ppoll([{fd=14, events=POLLIN}], 1, NULL, NULL, 8) = 1 ([{fd=14, revents=POLLIN}])
[pid 63729] read(14, "\1\0\0\1\1\36\0\0\2\3def\0\0\0\10COUNT(*)\0\f?\0\25\0\0"..., 16384) = 63
[pid 63729] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3519, ...}) = 0
[pid 63729] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3519, ...}) = 0
[pid 63729] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3519, ...}) = 0
[pid 63729] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3519, ...}) = 0
[pid 63729] poll([{fd=14, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
[pid 63729] write(14, "\221\0\0\0\3SELECT COUNT(*) FROM `test_"..., 149) = 149
[pid 63729] ppoll([{fd=14, events=POLLIN}], 1, NULL, NULL, 8) = 1 ([{fd=14, revents=POLLIN}])
[pid 63729] read(14, "\1\0\0\1\1\36\0\0\2\3def\0\0\0\10COUNT(*)\0\f?\0\25\0\0"..., 16384) = 63
[pid 63729] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3519, ...}) = 0
[pid 63729] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3519, ...}) = 0
[pid 63729] poll([{fd=14, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
[pid 63729] write(14, "\221\0\0\0\3SELECT COUNT(*) FROM `test_"..., 149) = 149
そして同じパターンが延々と続く。コードでfd 14をチェックしました
ls -l /proc/63729/fd
そして、これは私が得たものです:
lr-x------ 1 myuser myuser 64 May 9 05:38 0 -> /dev/null
l-wx------ 1 myuser myuser 64 May 9 05:38 1 -> /home/myuser/webapp/shared/log/passenger.log
lrwx------ 1 myuser myuser 64 May 9 05:38 10 -> socket:[430845495]
lrwx------ 1 myuser myuser 64 May 9 05:38 11 -> socket:[430860531]
lrwx------ 1 myuser myuser 64 May 9 05:38 12 -> socket:[430845847]
lrwx------ 1 myuser myuser 64 May 9 05:38 13 -> socket:[430845850]
lrwx------ 1 myuser myuser 64 May 9 05:38 14 -> socket:[430845864]
l-wx------ 1 myuser myuser 64 May 9 05:38 2 -> /home/myuser/webapp/shared/log/passenger.log
l-wx------ 1 myuser myuser 64 May 9 05:38 3 -> /home/myuser/webapp/shared/log/production.log
lr-x------ 1 myuser myuser 64 May 9 05:38 4 -> pipe:[430845856]
lr-x------ 1 myuser myuser 64 May 9 05:38 5 -> pipe:[430845845]
l-wx------ 1 myuser myuser 64 May 9 05:38 6 -> pipe:[430845845]
lr-x------ 1 myuser myuser 64 May 9 05:38 7 -> pipe:[430845846]
l-wx------ 1 myuser myuser 64 May 9 05:38 8 -> pipe:[430845856]
lrwx------ 1 myuser myuser 64 May 9 05:38 9 -> socket:[430845494]
これは私が今立ち往生しているところです。ソケットIDからリクエストを取得する方法、またはstraceからSQLコマンドを取得する方法はわかりませんが、問題はSQLまたはActiveRecordの悪用である可能性があります。誰でもこれについて私を助けることができますか? 不足している情報があるかどうかはわかりませんが、必要に応じて提供します。どんなことでも大歓迎です。ありがとう!