Linux ulimitコマンドとは?システムリソースを管理する重要ツール

「too many open filesというエラーが出た…」
「ulimitコマンドって何?どう使うの?」
「Linuxサーバーのリソース制限を設定したい」

Linuxでサーバーを運用していると、こんな問題に遭遇することがあります。

実は、Linuxには各ユーザーやプロセスが使えるリソース(資源)に制限があるんです。この制限を管理するのが「ulimitコマンド」。この記事では、ulimitの基本から実践的な使い方まで、初心者の方にも分かりやすく解説します。

読み終わる頃には、あなたもリソース管理の達人になれますよ!


スポンサーリンク
  1. ulimitとは?リソースの「使用上限」を設定するコマンド
    1. リソースって何?
    2. なぜ制限が必要なの?
  2. ulimitコマンドの基本的な使い方
    1. 現在の制限を確認する
    2. 特定の制限だけを確認
  3. 主要なulimitオプション
    1. -n:開けるファイル数(open files)
    2. -u:ユーザープロセス数(max user processes)
    3. -s:スタックサイズ(stack size)
    4. -f:ファイルサイズ(file size)
    5. -c:コアファイルサイズ(core file size)
    6. -t:CPUタイム(cpu time)
    7. -v:仮想メモリ(virtual memory)
  4. ハードリミットとソフトリミット
    1. ソフトリミット(Soft Limit)
    2. ハードリミット(Hard Limit)
    3. 両方を同時に表示
    4. ソフトリミットの変更
    5. ハードリミットの変更(root権限必要)
  5. 設定の永続化:/etc/security/limits.conf
    1. limits.confファイル
    2. 設定の書式
    3. 設定例
    4. 設定を反映
    5. 確認
  6. systemdサービスでの設定
    1. サービスユニットファイルで設定
    2. 設定例
    3. 設定を反映
    4. 確認
  7. 実践例:Webサーバーの設定
    1. 問題の発症
    2. 解決策1:limits.confで設定
    3. 解決策2:systemdサービスで設定
    4. 確認
  8. トラブルシューティング
    1. 問題1:「Too many open files」エラー
    2. 問題2:「Resource temporarily unavailable」エラー
    3. 問題3:設定が反映されない
    4. 問題4:「Operation not permitted」エラー
  9. セキュリティのベストプラクティス
    1. 1. デフォルト値を確認
    2. 2. 用途に応じた設定
    3. 3. プロセス数の制限は必須
    4. 4. コアダンプの扱い
    5. 5. 定期的な見直し
  10. 制限値の決め方
    1. ステップ1:現在の使用状況を確認
    2. ステップ2:ピーク時の値を把握
    3. ステップ3:余裕を持たせる
    4. ステップ4:段階的に調整
  11. よくあるエラーメッセージと対処法
    1. 「bash: fork: retry: Resource temporarily unavailable」
    2. 「cannot open shared object file: Too many open files」
    3. 「Segmentation fault (core dumped)」が出るのにコアファイルがない
  12. よくある質問
    1. Q1. ulimitの設定は他のユーザーに影響する?
    2. Q2. rootユーザーにも制限がかかる?
    3. Q3. 制限値を大きくしすぎるとどうなる?
    4. Q4. dockerコンテナ内でulimitは使える?
  13. まとめ: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

設定を反映

設定ファイルを編集した後:

  1. ファイルを保存
  2. 一度ログアウト
  3. 再ログイン

新しいセッションから設定が適用されます。

確認

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ライフを!

コメント

タイトルとURLをコピーしました