ここ最近、プログラムを長時間動作させているとファイルディスクリプタの上限に達してしまう問題の原因究明を行なっていました。
原因はUnixのドメインソケットがクローズできない条件があった事が原因なのですが、ファイルディスクリプターの上限に達してしまった時の調査について記載します。
## 確認方法
プログラム実行中に開いているファイルディスクリプターは以下の場所で確認できます。
```bash
`gutter:false;
$ sudo ls /proc/<PID>/fd
```
数を数えるには、wcコマンドで....
```bash
`gutter:false;
$ sudo ls /proc/<PID>/fd | wc -l
```
プロセスIDはpsコマンドなどで調べます。
リニアにファイルディスクリプターの数が増えていってしまう場合は何かしらか問題を疑います。
## ファイルディスクリプターの種類を調べる
増えていくファイルディスクリプター種類を調べるには、lsofコマンドを使います。
(ここに早く気付ければ1日ぐらい時間短縮できます)
```bash
`gutter:false;
$ sudo lsof -c <プロセス名>
もしくは
$ sudo lsof -p <PID>
```
### 実行例
```bash
`gutter:false;
$ sudo lsof -p 26819
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 26819 k28 cwd DIR 179,2 4096 400440 /home/k28/bot/alice
node 26819 k28 rtd DIR 179,2 4096 2 /
node 26819 k28 txt REG 179,2 22260030 399579 /home/k28/.nvm/versions/node/v4.4.1/bin/node
node 26819 k28 mem REG 179,2 75644 27186 /lib/arm-linux-gnueabihf/libresolv-2.19.so
node 26819 k28 mem REG 179,2 18048 27180 /lib/arm-linux-gnueabihf/libnss_dns-2.19.so
node 26819 k28 mem REG 179,2 9600 27069 /lib/arm-linux-gnueabihf/libnss_mdns4_minimal.so.2
node 26819 k28 mem REG 179,2 46820 27181 /lib/arm-linux-gnueabihf/libnss_files-2.19.so
node 26819 k28 mem REG 179,2 1242776 27172 /lib/arm-linux-gnueabihf/libc-2.19.so
node 26819 k28 mem REG 179,2 122308 27193 /lib/arm-linux-gnueabihf/libpthread-2.19.so
node 26819 k28 mem REG 179,2 117520 4398 /lib/arm-linux-gnueabihf/libgcc_s.so.1
node 26819 k28 mem REG 179,2 435804 27176 /lib/arm-linux-gnueabihf/libm-2.19.so
node 26819 k28 mem REG 179,2 809612 1552 /usr/lib/arm-linux-gnueabihf/libstdc++.so.6.0.20
node 26819 k28 mem REG 179,2 26672 27187 /lib/arm-linux-gnueabihf/librt-2.19.so
node 26819 k28 mem REG 179,2 9820 27175 /lib/arm-linux-gnueabihf/libdl-2.19.so
node 26819 k28 mem REG 179,2 18920 24002 /usr/lib/arm-linux-gnueabihf/libarmmem.so
node 26819 k28 mem REG 179,2 134456 27169 /lib/arm-linux-gnueabihf/ld-2.19.so
node 26819 k28 0u unix 0xb11f9200 0t0 49214411 socket
node 26819 k28 1u unix 0xb11f9800 0t0 49214413 socket
node 26819 k28 2u unix 0xb11fbc00 0t0 49214415 socket
node 26819 k28 3r FIFO 0,10 0t0 49216225 pipe
node 26819 k28 4w FIFO 0,10 0t0 49216225 pipe
node 26819 k28 5u 0000 0,11 0 4977 anon_inode
node 26819 k28 6r FIFO 0,10 0t0 49216226 pipe
node 26819 k28 7w FIFO 0,10 0t0 49216226 pipe
node 26819 k28 8u 0000 0,11 0 4977 anon_inode
node 26819 k28 9r CHR 1,3 0t0 1028 /dev/null
node 26819 k28 10u IPv4 49216966 0t0 TCP *:9999 (LISTEN)
node 26819 k28 11u IPv4 49216968 0t0 TCP carbon.local:46216->ec2-13-115-86-198.ap-northeast-1.compute.amazonaws.com:https (ESTABLISHED)
```
FDが数字から始まっているものに注目します。->これが増えていくとやばい。
TYPEで種類がわかるので、あたりをつけます。
0 件のコメント :
コメントを投稿