読者です 読者をやめる 読者になる 読者になる

tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

ファイルディスクリプタとかulimitとか/proc/sys/fsとかめも

はじめに

ファイルディスクリプタについては理解も薄かったのでこの機会にメモ

ついでに

td-agent(fluentd)を使うにあたってファイルディスクリプタについてこんな表記がある

ファイルディスクリプタの最大数を増やしてください。現在の数値は ulimit -n コマンドで確認できます。

treasure dataさんの「Fluentdインストールの前に」ページです

ファイルディスクリプタについて

ファイルディスクリプタとは

プログラムがアクセスするファイルや標準入出力などをOSが識別するために用いる識別子のこと

Linuxのファイルディスクリプタ数を変更・確認する方法

ファイルディスクリプタ数とは

1プロセスで同時にオープン可能なファイルディスクリプタ
デフォルトで1024となっているケースが多い

ファイルディスクリプタ確認方法

  • 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
2./proc/sys/fs/file-max

OS全体でオープン可能なファイルディスクリプタ数を確認する

# cat /proc/sys/fs/file-max
1175636
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の罠

注意点まとめ

・PAM認証を介さないようなdaemon系プログラムの制限には/etc/security/limits.confは使えない
・td-agentとかは起動スクリプトに「ulimit -n 65536」と追記する

知らなかったら絶対罠にハマってました(><)