0

ここで、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の悪用である可能性があります。誰でもこれについて私を助けることができますか? 不足している情報があるかどうかはわかりませんが、必要に応じて提供します。どんなことでも大歓迎です。ありがとう!

4

1 に答える 1