はじめに
ファイルディスクリプタについては理解も薄かったのでこの機会にメモ
参考
主にこちらのサイトを参考にさせて頂きました
→絵で見てわかるファイルディスクリプタ・パイプ・リダイレクト
→Linuxのファイルディスクリプタ数を変更・確認する方法
→180style wiki>ファイルディスクリプタを確認する
→ファイルディスクリプタ数の上限変更とlimits.confの罠
補足
こんなのもあります
→ファイルディスクリプタをperlで見てみたいときメモ
ファイルディスクリプタについて
ファイルディスクリプタ確認方法
- 1.ulimit
- 2./proc/sys/fs/file-max
- 3./proc/sys/fs/file-nr
1.ulimitで確認
ユーザー制限つきのファイルディスクリプタ数を確認する
# ulimit -n 1024 # ulimit -a -t: cpu time (seconds) unlimited -f: file size (blocks) unlimited -d: data seg size (kbytes) unlimited -s: stack size (kbytes) 10240 -c: core file size (blocks) 0 -m: resident set size (kbytes) unlimited -u: processes 1024 -n: file descriptors 1024 -l: locked-in-memory size (kb) 64 -v: address space (kb) unlimited -x: file locks unlimited -i: pending signals 95110 -q: bytes in POSIX msg queues 819200 -e: max nice 0 -r: max rt priority 0 # sudo su # ulimit -n 65536
3./proc/sys/fs/file-nr
OS全体のディスクリプタを確認
# cat /proc/sys/fs/file-nr 7140 0 1175636
左から
・今までにオープンしたことのあるファイルの最大数(割り当て済みのファイルハンドル数 )
・現在オープンしているファイルの総数(使用中のファイルハンドル数 )
・オープン可能なファイル数の上限(/proc/sys/fs/file-max と同じ値)
※参考サイトをそのまま引用させて頂きました!
4.プロセスごとの利用可能ディスクリプタ数
td-agentの利用可能なディスクリプタ数を確認
# ps aux | grep td-agent td-agent 19196 0.0 1.1 213068 22308 ? Sl Dec18 0:00 /usr/lib64/fluent/・・・省略・・・td-agent/td-agent.pid td-agent 19199 0.0 10.2 403192 197160 ? Sl Dec18 3:36 /usr/lib64/fluent/・・・省略・・・td-agent/td-agent.pid # cat /proc/19196/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 10485760 unlimited bytes Max core file size 0 0 bytes Max resident set unlimited unlimited bytes Max processes 1024 unlimited processes Max open files 1024 4096 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 14891 14891 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
Max open filesの行がそれにあたります
ファイルディスクリプタの設定
- 1.ulimit(手動)
- 2.ulimit(起動スクリプトなどに追記)
- 3./etc/security/limits.conf
1.ulimit(手動)
コマンドulimitで設定します
ulimitを実行したシェルと、シェルから起動される子プロセスが対象
ログインしている間有効
# ulimit -n 1024 # ulimit -n 2048 # ulimit -n 2048 ----ここでいったんログイン→ログアウト---- login as: hoge Authenticating with public key "imported-openssh-key" Passphrase for key "imported-openssh-key": Last login: Fri Dec 20 18:23:39 2013 from 172.21.65.97 # ulimit -n 1024
2.ulimit(起動スクリプトなどに追記)
例としてtd-agentのulimitを変える場合でためします
※td-agentのpidを確認 # pgrep -f td-agent -l 23141 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent ・・・省略・・・ 23144 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent ・・・省略・・・ ※今の状態の利用可能なディスクリプタ数を確認 # sudo cat /proc/23141/limits | grep 'Max open files' Max processes 1024 unlimited processes ※起動スクリプトの適当なところにulimitを追記 # sudo vi /etc/init.d/td-agent ---viで追記---- ulimit -n 65536 --------------- # 再起動 # sudo /etc/init.d/td-agent restart Shutting down td-agent: [ OK ] Starting td-agent: [ OK ] ※再起動後のtd-agentのpidを確認 # pgrep -f td-agent -l 23520 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent ・・・省略・・・ 23523 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent ・・・省略・・・ ※再起動後の利用可能なディスクリプタ数を確認 # sudo cat /proc/23520/limits | grep 'Max open files' Max open files 65536 65536 files
65536に変更されました
3./etc/security/limits.confで設定
こちらは↑の1や2の設定がされてない状態でやります。
※途中td-agentが利用可能なディスクリプタ数も設定されたように見えますがされてませんのでご注意を
※ログインユーザのulimit確認 # ulimit -n 1024 ※td-agentが利用可能なディスクリプタ数を確認 # pgrep -f td-agent -l 25078 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent ・・・省略・・・ 25081 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent ・・・省略・・・ # sudo cat /proc/25078/ | grep 'Max open files' Max open files 1024 4096 files # sudo vi /etc/security/limits.conf ----viで一番下とかに追記---- * soft nofile 2048 * hard nofile 2048 ---------------------------- ※※※※ここでターミナルを新しく開きなおす※※※※ ※ログインユーザのulimit確認 # ulimit -n 2048 ※※※※td-agent再起動※※※※ # sudo /etc/init.d/td-agent restart Shutting down td-agent: [ OK ] Starting td-agent: [ OK ] # pgrep -f td-agent -l 28040 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent ・・・省略・・・ 28045 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent ・・・省略・・・ # sudo cat /proc/28040/limits | grep 'Max open files' Max open files 2048 2048 files ※※※※ここでサーバを再起動(td-agentは自動起動設定済)※※※※ # pgrep -f td-agent -l 28719 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent ・・・省略・・・ 28722 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent ・・・省略・・・ ※マシンを再起動するともどってしまう # sudo cat /proc/28719/limits | grep 'Max open files' Max open files 1024 4096 files
一瞬、td-agentの利用可能なディスクリプタ数も設定されたように見えますがマシンを再起動するともどってしまいます。
詳しい説明は、参考にさせていただいたサイトに詳しく書いてありますのでご参考ください
→ファイルディスクリプタ数の上限変更とlimits.confの罠