「too many open filesというエラーが出た…」
「ulimitコマンドって何?どう使うの?」
「Linuxサーバーのリソース制限を設定したい」
Linuxでサーバーを運用していると、こんな問題に遭遇することがあります。
実は、Linuxには各ユーザーやプロセスが使えるリソース(資源)に制限があるんです。この制限を管理するのが「ulimitコマンド」。この記事では、ulimitの基本から実践的な使い方まで、初心者の方にも分かりやすく解説します。
読み終わる頃には、あなたもリソース管理の達人になれますよ!
ulimitとは?リソースの「使用上限」を設定するコマンド

ulimitは、ユーザーやプロセスが使用できるシステムリソースの上限を設定・確認するLinuxコマンドです。
「user limit(ユーザー制限)」が語源で、「ユーリミット」と読みます。
リソースって何?
リソースとは、コンピュータの「資源」のこと。具体的には:
- ファイルディスクリプタ(開けるファイルの数)
- プロセス数(起動できるプログラムの数)
- メモリサイズ
- CPUタイム
- ファイルサイズ
これらを無制限に使えてしまうと、一人のユーザーがシステム全体を専有してしまう可能性があります。
なぜ制限が必要なの?
理由1:システムの安定性
一つのプロセスが暴走しても、システム全体がダウンしないようにします。
実例:
プログラムのバグで無限にファイルを開き続けても、制限があればある時点で止まります。
理由2:公平なリソース配分
複数のユーザーが使うサーバーで、特定のユーザーがリソースを独占するのを防ぎます。
理由3:セキュリティ
DoS攻撃(サービス妨害攻撃)の影響を最小限に抑えられます。
ulimitコマンドの基本的な使い方
実際にulimitコマンドを使ってみましょう。
現在の制限を確認する
すべての制限を表示:
ulimit -a
出力例:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7823
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7823
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
一つ一つの項目について、後で詳しく説明しますね。
特定の制限だけを確認
開けるファイル数の上限:
ulimit -n
出力例:
1024
これは「最大1024個のファイルを同時に開ける」という意味です。
起動できるプロセス数:
ulimit -u
スタックサイズ:
ulimit -s
主要なulimitオプション
よく使われるオプションを紹介します。
-n:開けるファイル数(open files)
同時に開けるファイルディスクリプタの最大数です。
確認:
ulimit -n
変更:
ulimit -n 4096
実例:
Webサーバーやデータベースサーバーでは、多くの接続を同時に処理するため、この値を大きくする必要があります。
-u:ユーザープロセス数(max user processes)
ユーザーが起動できる最大プロセス数です。
確認:
ulimit -u
変更:
ulimit -u 2048
実例:
フォークボム(無限にプロセスを生成する攻撃)を防ぐために重要です。
-s:スタックサイズ(stack size)
各プロセスが使えるスタックメモリのサイズです(単位:KB)。
確認:
ulimit -s
変更:
ulimit -s 16384
実例:
深い再帰処理を行うプログラムでは、スタックサイズを大きくする必要があることがあります。
-f:ファイルサイズ(file size)
作成できるファイルの最大サイズです(単位:ブロック)。
確認:
ulimit -f
変更(unlimited):
ulimit -f unlimited
-c:コアファイルサイズ(core file size)
プログラムがクラッシュしたときに生成されるコアダンプファイルのサイズです。
確認:
ulimit -c
コアダンプを有効化:
ulimit -c unlimited
デバッグ時に便利ですが、ディスク容量を圧迫する可能性があります。
-t:CPUタイム(cpu time)
プロセスが使用できる最大CPU時間です(単位:秒)。
確認:
ulimit -t
変更:
ulimit -t 3600
-v:仮想メモリ(virtual memory)
プロセスが使用できる仮想メモリの最大サイズです(単位:KB)。
確認:
ulimit -v
変更:
ulimit -v 2097152 # 2GB
ハードリミットとソフトリミット
ulimitには2種類の制限があります。
ソフトリミット(Soft Limit)
現在実際に適用されている制限値です。
特徴:
- ユーザーが自由に変更できる(ハードリミットの範囲内)
- プログラムの実行中に変更可能
確認:
ulimit -Sn # ソフトリミットを表示(-Sオプション)
ハードリミット(Hard Limit)
ソフトリミットの上限値です。
特徴:
- 一般ユーザーは減らすことはできるが、増やせない
- root権限があれば変更可能
確認:
ulimit -Hn # ハードリミットを表示(-Hオプション)
両方を同時に表示
ulimit -Sn # ソフトリミット
ulimit -Hn # ハードリミット
出力例:
1024 # ソフトリミット
4096 # ハードリミット
この場合、現在は1024が適用されていますが、4096まで増やせるということです。
ソフトリミットの変更
ulimit -Sn 2048
この変更は、ハードリミット(4096)を超えない範囲で可能です。
ハードリミットの変更(root権限必要)
sudo ulimit -Hn 8192
設定の永続化:/etc/security/limits.conf
ulimitコマンドで設定した値は、現在のシェルセッションのみ有効です。ログアウトすると元に戻ってしまいます。
永続的に設定するには、設定ファイルを編集します。
limits.confファイル
場所:
/etc/security/limits.conf
編集:
sudo nano /etc/security/limits.conf
設定の書式
<domain> <type> <item> <value>
各項目の説明:
domain:
- ユーザー名(例:
taro) - グループ名(例:
@developers) *(すべてのユーザー)
type:
soft:ソフトリミットhard:ハードリミット-:両方
item:
nofile:開けるファイル数(ulimit -n)nproc:プロセス数(ulimit -u)stack:スタックサイズ(ulimit -s)core:コアファイルサイズ(ulimit -c)fsize:ファイルサイズ(ulimit -f)
value:
- 数値または
unlimited
設定例
すべてのユーザーの開けるファイル数を増やす:
* soft nofile 4096
* hard nofile 65536
特定ユーザーのプロセス数を制限:
taro soft nproc 1024
taro hard nproc 2048
データベースグループのメモリ制限:
@database - memlock unlimited
Webサーバー用の設定:
www-data soft nofile 10000
www-data hard nofile 30000
設定を反映
設定ファイルを編集した後:
- ファイルを保存
- 一度ログアウト
- 再ログイン
新しいセッションから設定が適用されます。
確認
ulimit -a
設定した値が反映されているか確認しましょう。
systemdサービスでの設定

systemdで管理されているサービスには、別の方法で制限を設定します。
サービスユニットファイルで設定
場所:
/etc/systemd/system/<サービス名>.service
または
/usr/lib/systemd/system/<サービス名>.service
設定例
nginxの例:
[Service]
LimitNOFILE=65536
LimitNPROC=4096
主なディレクティブ:
LimitNOFILE:開けるファイル数LimitNPROC:プロセス数LimitSTACK:スタックサイズLimitCORE:コアファイルサイズ
設定を反映
sudo systemctl daemon-reload
sudo systemctl restart nginx
確認
sudo systemctl show nginx | grep Limit
実践例:Webサーバーの設定
実際のWebサーバー(nginx)で設定してみましょう。
問題の発症
Webサーバーで大量のリクエストを処理していると、以下のエラーが発生:
nginx: [alert] 1234#0: worker process 5678 exited on signal 11
socket() failed (24: Too many open files)
これは、開けるファイル数の制限に達したことを示しています。
解決策1:limits.confで設定
sudo nano /etc/security/limits.conf
追加:
nginx soft nofile 10000
nginx hard nofile 30000
解決策2:systemdサービスで設定
sudo mkdir -p /etc/systemd/system/nginx.service.d
sudo nano /etc/systemd/system/nginx.service.d/limits.conf
内容:
[Service]
LimitNOFILE=30000
リロードと再起動:
sudo systemctl daemon-reload
sudo systemctl restart nginx
確認
nginxプロセスの制限を確認:
cat /proc/$(pidof nginx | awk '{print $1}')/limits
出力例:
Limit Soft Limit Hard Limit Units
Max open files 30000 30000 files
トラブルシューティング
よくある問題と解決策です。
問題1:「Too many open files」エラー
症状:
プログラムがファイルを開こうとすると失敗する。
原因:
開けるファイル数の制限(nofile)を超えている。
解決策:
一時的な対処:
ulimit -n 4096
恒久的な対処:/etc/security/limits.confに設定:
* soft nofile 4096
* hard nofile 65536
問題2:「Resource temporarily unavailable」エラー
症状:
新しいプロセスやスレッドを作成できない。
原因:
プロセス数の制限(nproc)を超えている。
確認:
ps -u $USER | wc -l
ulimit -u
解決策:
ulimit -u 2048
またはlimits.confに設定。
問題3:設定が反映されない
チェック項目:
1. PAMが有効か確認:
grep pam_limits.so /etc/pam.d/common-session
以下の行があるはずです:
session required pam_limits.so
2. 正しい書式か確認:
limits.confの各行の書式が正しいか確認します。
3. ログアウト・ログインしたか:
設定はログインセッションの開始時に読み込まれます。
問題4:「Operation not permitted」エラー
症状:
ulimitで値を増やそうとするとエラーになる。
原因:
ハードリミットを超えようとしている、または権限が足りない。
解決策:
ハードリミットを確認:
ulimit -Hn
rootで実行するか、limits.confで設定します。
セキュリティのベストプラクティス
適切なリソース制限でシステムを守りましょう。
1. デフォルト値を確認
まず現在の設定を把握します:
ulimit -a
2. 用途に応じた設定
一般ユーザー:
* soft nofile 1024
* hard nofile 4096
* soft nproc 1024
* hard nproc 2048
Webサーバー(nginx、Apache):
www-data soft nofile 10000
www-data hard nofile 65536
データベースサーバー(MySQL、PostgreSQL):
mysql soft nofile 10000
mysql hard nofile 65536
mysql - memlock unlimited
3. プロセス数の制限は必須
フォークボム攻撃を防ぐため、必ずnprocに制限を設けます:
* hard nproc 2048
4. コアダンプの扱い
開発環境:
デバッグのため有効化
* - core unlimited
本番環境:
ディスク容量保護のため無効化
* - core 0
5. 定期的な見直し
システムの使用状況に応じて、制限値を調整します。
制限値の決め方
適切な制限値をどう決めるか、考え方を紹介します。
ステップ1:現在の使用状況を確認
開いているファイル数:
lsof | wc -l
プロセス数:
ps aux | wc -l
ステップ2:ピーク時の値を把握
負荷が高い時間帯に測定します。
ステップ3:余裕を持たせる
測定値の1.5〜2倍程度を目安に設定します。
実例:
通常時に2000ファイル開いているなら、制限値は3000〜4000に設定。
ステップ4:段階的に調整
いきなり大きな値にせず、様子を見ながら調整します。
よくあるエラーメッセージと対処法
「bash: fork: retry: Resource temporarily unavailable」
意味:
新しいプロセスを作成できない。
対処:
ulimit -u 4096
「cannot open shared object file: Too many open files」
意味:
ライブラリファイルを開けない。
対処:
ulimit -n 4096
「Segmentation fault (core dumped)」が出るのにコアファイルがない
意味:
コアダンプが無効化されている。
対処:
ulimit -c unlimited
よくある質問
Q1. ulimitの設定は他のユーザーに影響する?
いいえ。ulimitコマンドで変更した値は、現在のシェルセッションのみに適用されます。他のユーザーや他のセッションには影響しません。
Q2. rootユーザーにも制限がかかる?
はい、rootユーザーにも制限はかかります。ただし、rootは自由にハードリミットを変更できます。
Q3. 制限値を大きくしすぎるとどうなる?
システムリソースを使い果たす可能性があります。適切な値に設定しましょう。
Q4. dockerコンテナ内でulimitは使える?
はい。コンテナ起動時に--ulimitオプションで設定できます:
docker run --ulimit nofile=10000:20000 myimage
まとめ:ulimitでシステムを守る
ulimitコマンドは、Linuxシステムのリソース管理に欠かせないツールです。
ulimitの重要ポイント:
- ユーザーやプロセスのリソース使用量を制限
- システムの安定性とセキュリティを向上
- 一時的な変更と永続的な設定が可能
主要なオプション:
-n:開けるファイル数-u:プロセス数-s:スタックサイズ-f:ファイルサイズ-c:コアファイルサイズ
2種類の制限:
- ソフトリミット:現在適用中の制限
- ハードリミット:ソフトリミットの上限
永続的な設定:
/etc/security/limits.confを編集- systemdサービスは
LimitXXXディレクティブを使用
よくある問題:
- 「Too many open files」→
-nを増やす - 「Resource temporarily unavailable」→
-uを増やす
セキュリティのポイント:
- プロセス数制限は必須(フォークボム対策)
- 用途に応じて適切な値を設定
- 定期的に見直しを行う
適切なリソース制限を設定して、安定したLinuxシステムを運用しましょう!
快適なLinuxライフを!

コメント