はじめに
この実験では、Linux でカーネルのメモリ制限を確認し理解する方法を探ります。カーネルがメモリ割り当て要求をどのように処理するかを制御する vm.overcommit_memory 設定に焦点を当てます。
実践的な手順を通じて、sysctl コマンドを使ってこのカーネルパラメータを表示し一時的に変更する方法、/proc/sys/vm ディレクトリを調べてメモリ設定を検証する方法、および /etc/sysctl.d 内の永続的なカーネル設定ファイルを特定する方法を学びます。この実験は、Linux のメモリ動作を管理し理解するための実践的な経験を提供します。
sysctl vm.overcommit でメモリ制限を確認する
このステップでは、Linux がメモリ割り当てをどのように管理するかを探ります。具体的には、sysctl コマンドを使用して vm.overcommit_memory 設定に焦点を当てます。
sysctl コマンドは、実行時にカーネルパラメータを変更するために使用されます。これらのパラメータは、多くの場合 /proc/sys/ ディレクトリに保存されています。vm.overcommit_memory パラメータは、カーネルが利用可能な物理 RAM を超えるメモリ要求をどのように処理するかを制御します。
vm.overcommit_memory には 3 つの可能な値があります。
0: ヒューリスティックなオーバーコミット。カーネルは、メモリ割り当て要求が可能かどうかを推定しようとします。これがデフォルト設定です。1: 常にオーバーコミット。カーネルは、利用可能なメモリを超える場合でも、常にメモリ割り当て要求を承認します。これにより、実際にメモリを使用しようとした場合にプロセスが後で殺される可能性があります。2: 決してオーバーコミットしない。カーネルは、利用可能なスワップ領域の合計と物理 RAM の設定可能な割合を超えるメモリ割り当て要求を承認しません。
vm.overcommit_memory の現在の値を確認しましょう。ターミナルを開き、次のコマンドを入力します。
sysctl vm.overcommit_memory
Enter キーを押します。
次のような出力が表示されるはずです。
vm.overcommit_memory = 0
この出力は、vm.overcommit_memory の現在の設定が 0 であることを示しており、これはカーネルがヒューリスティックなオーバーコミットを使用していることを意味します。
この設定を理解することは、システムリソースを管理し、特定のアプリケーションでメモリ不足エラーを防ぐために重要です。
では、この値を一時的に変更してみましょう。sudo sysctl -w を使用することでこれを行うことができます。-w フラグを使用すると、カーネルパラメータに新しい値を書き込むことができます。
vm.overcommit_memory を 1 に設定するには、次のコマンドを入力します。
sudo sysctl -w vm.overcommit_memory=1
Enter キーを押します。
変更が確認される出力が表示されるはずです。
vm.overcommit_memory = 1
では、再度値を確認して、変更されたことを確認しましょう。
sysctl vm.overcommit_memory
Enter キーを押します。
出力は次のように表示されるはずです。
vm.overcommit_memory = 1
sysctl -w で行った変更は一時的であり、システムを再起動するとリセットされることに注意してください。後のステップで、これらの変更を永続的にする方法を探ります。
続ける をクリックして次のステップに進みます。
/proc/sys/vm のメモリ設定を検証する
前のステップでは、sysctl コマンドを使用して vm.overcommit_memory カーネルパラメータを確認し変更しました。では、これらのパラメータが実際にファイルシステムのどこに保存されているかを見てみましょう。
Linux は、/proc/sys にある仮想ファイルシステムを通じてカーネルパラメータを公開しています。このファイルシステムにはディスク上の実際のファイルは含まれておらず、実行中のカーネルとやり取りするためのインターフェースを提供しています。
メモリ関連のパラメータは /proc/sys/vm/ ディレクトリにあります。このディレクトリ内のファイルを一覧表示するには、ls コマンドを使用できます。
ターミナルを開き、次のコマンドを入力します。
ls /proc/sys/vm/
Enter キーを押します。
各々が仮想メモリに関連するカーネルパラメータを表すファイルのリストが表示されます。出力は次のようになります(正確なファイルはカーネルバージョンによって若干異なる場合があります)。
admin_reserve_kbytes hugetlb_shm_group oom_kill_allocating_task
block_dump laptop_mode oom_score_adj
compact_hueristics lowmem_reserve_ratio overcommit_memory
compact_memory max_map_count overcommit_ratio
... (他にも多数のファイル)
overcommit_memory という名前のファイルに注目してください。このファイルには、前のステップで操作していた vm.overcommit_memory パラメータの現在の値が含まれています。
このファイルの内容を表示するには、cat コマンドを使用できます。前のステップで値を 1 に設定したことを思い出してください。
次のコマンドを入力します。
cat /proc/sys/vm/overcommit_memory
Enter キーを押します。
出力は次のようになるはずです。
1
これにより、sysctl -w を使用して設定した値が /proc/sys/vm/overcommit_memory ファイルに反映されていることが確認されます。
cat を使用して、このディレクトリ内の他のメモリ関連のパラメータも表示できます。たとえば、オーバーコミット比率を表示するには、次のようにします。
cat /proc/sys/vm/overcommit_ratio
Enter キーを押します。
出力には、vm.overcommit_memory が 2 に設定されている場合に使用される現在のオーバーコミット比率が表示されます。
50
/proc/sys/vm/ 内のファイルを調べることは、Linux のメモリ管理を制御するさまざまなカーネルパラメータを理解するための優れた方法です。
続ける をクリックして次のステップに進みます。
/etc/sysctl.d の sysctl 設定を確認する
前のステップでは、sysctl を使用してカーネルパラメータを確認し一時的に変更する方法と、これらのパラメータが /proc/sys ファイルシステムにどのように反映されるかを学びました。ただし、sysctl -w で行った変更は永続的ではありません。カーネルパラメータの変更を再起動後も保持するには、特定の設定ファイルでそれらを設定する必要があります。
永続的な sysctl 設定の主な場所は /etc/sysctl.conf ファイルです。さらに、Linux システムでは /etc/sysctl.d/ ディレクトリを使用して、設定の断片を個別のファイルに保存することがよくあります。このモジュール方式により、異なるアプリケーションやシステムコンポーネントの設定を管理しやすくなります。
/etc/sysctl.d/ ディレクトリの内容を確認しましょう。このディレクトリ内のファイルを一覧表示するには、ls コマンドを使用できます。
ターミナルを開き、次のコマンドを入力します。
ls /etc/sysctl.d/
Enter キーを押します。
設定ファイルのリストが表示されます。これらのファイルは通常 .conf 拡張子を持っています。出力は次のようになるかもしれません。
10-console-messages.conf 10-kernel-hardening.conf 10-tcp-congestion-control.conf 99-sysctl.conf
これらの各ファイルには、parameter = value の形式で sysctl パラメータ設定を含めることができます。システムが起動すると、/etc/sysctl.conf を読み込み、その後 /etc/sysctl.d/ 内のすべてのファイルをアルファベット順に読み込んで、永続的なカーネルパラメータ設定を適用します。
これらの設定ファイルの 1 つ、たとえば 10-kernel-hardening.conf の内容を表示しましょう。その内容を表示するには、cat コマンドを使用できます。
次のコマンドを入力します。
cat /etc/sysctl.d/10-kernel-hardening.conf
Enter キーを押します。
このファイルで設定されたカーネルパラメータが表示されます。内容は異なりますが、セキュリティやシステムの動作に関連する設定が含まれている場合があります。
#
## sysctl settings for kernel hardening
#
## Disable unprivileged user namespaces
kernel.unprivileged_userns_clone=0
## Protect against symlink attacks
fs.protected_hardlinks=1
fs.protected_symlinks=1
## Disable kexec
kernel.kexec_load_disabled=1
## Disable bpf JIT
net.core.bpf_jit_enable=0
## Disable ptrace access to other processes
kernel.yama.ptrace_scope=1
kernel.unprivileged_userns_clone や fs.protected_hardlinks などのカーネルパラメータがここでどのように設定されているかがわかります。
vm.overcommit_memory=1 の設定を永続的にするには、通常、vm.overcommit_memory = 1 という行を /etc/sysctl.d/ の新しいまたは既存のファイル(または /etc/sysctl.conf)に追加します。ただし、この入門実験の目的上、この変更を永続的にはしません。
/etc/sysctl.d/ ディレクトリを理解することは、Linux システムで永続的なカーネルパラメータ設定を構成するために重要です。
続ける をクリックしてこの実験を完了します。
まとめ
この実験では、Linux のカーネルメモリ制限を確認し理解する方法を学びました。特に vm.overcommit_memory 設定に焦点を当てました。sysctl コマンドを使用して、このパラメータの現在の値を表示しました。このパラメータは、カーネルが利用可能な物理 RAM を超えるメモリ割り当て要求をどのように処理するかを制御します。3 つの可能な値 (0、1、および 2) とそれらがメモリ管理に与える影響を調べました。また、sudo sysctl -w を使用して vm.overcommit_memory の値を一時的に変更する練習も行いました。
さらに、カーネルパラメータのファイルシステムインターフェースを提供する /proc/sys/vm ディレクトリを調べることで、カーネルメモリ設定を検証しました。また、/etc/sysctl.d ディレクトリ内のファイルを調べることで、永続的なカーネルパラメータ設定を特定する方法も学びました。これらの手順により、Linux 環境でカーネルメモリ制限設定を確認し見つける方法を包括的に理解することができました。



