カーネル
基礎
- コンピュータの電源が入っている間、メモリに常駐し、すべてのハードウェアとソフトウェアを管理するソフトウェア
- 狭義の OS
item | content |
---|---|
プロセス管理 | システム上で動作するアプリケーションの実行制御 各プロセスごとに独自の実行環境を割り当て、マルチタスクを実現 |
空間管理 | プロセスごとに仮想メモリ空間を作り、メモリ割り当てを行なう メモリ不足になると、その一部をディスクに退避させたりしてメモリを効率的に利用 |
時間管理 | システム実行時間の管理 |
割り込み管理 | HW からの信号を受け取ってプログラムを起動する割り込みの制御を行なう キーボードの入力やディスク・ネットワークの入出力 |
ファイルシステム | ファイル格納 |
ネットワーク | ネットワーク通信機能の提供 |
プロセス管理
メモリ管理
- メモリ
- 仮想メモリ
-
- ext4
- VFS(Virtual File System)
デバイス管理
- デバイスファイル
- キャラクタデバイス
- キーボード
- マウス
- USB カメラ
- ブロックデバイス
- ハードディスク
- USB メモリ
- SD カード
設計思想および実装
- モノリシックカーネル
- OS の主要構成要素をすべて 1 つのメモリ空間にて提供
- Linux
- マイクロカーネル
- 必要最小限のみをカーネルが提供し、それ以外の機能はカーネル外で提供
- Mac OS X
- モノリシックカーネル
時間管理
- 時刻管理機能
- xtime
- 1970 年 1 月 1 日からの経過時間を秒単位/ナノ秒単位で保持する変数
- jiffiles
- 一定周期(タイマー割り込み)でカウントアップされる変数
- xtime
- クロックソース
タイマーデバイス
- TSC(Time Stamp Counter)
- CPU 内部のカウンター
- HPET(High Precision Event Timer)
- PIT(Periodic Interrupt Timer)
- TSC(Time Stamp Counter)
現状値
# cat /sys/devices/system/clocksource/clocksource0/current_clocksource kvm-clock
利用可能なクロックソース
# cat /sys/devices/system/clocksource/clocksource0/available_clocksource kvm-clock hpet acpi_pm
カーネルの構成要素
カーネルイメージ
Linux カーネルは通常、イメージファイルつぃてファイルシステム上に格納されている
vmlinuz-
で始まる名前がカーネルの実体起動に必要なファイルは
/boot
配下に存在$ ll /boot/ | grep vmlinuz- -rwxr-xr-x. 1 root root 5877760 9月 21 2017 vmlinuz-0-rescue-19f87e08fcd744f53d522029d0081944 -rwxr-xr-x. 1 root root 5877504 12月 5 2017 vmlinuz-3.10.0-693.11.1.el7.x86_64 -rwxr-xr-x. 1 root root 5877760 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64 -rwxr-xr-x. 1 root root 6242208 8月 15 07:02 vmlinuz-3.10.0-862.11.6.el7.x86_64
- 実際に動いているカーネルバージョン確認
# cat /proc/version
Linux version 3.10.0-862.14.4.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP Wed Sep 26 15:12:11 UTC 2018
- 実際に動いているカーネルバージョン確認
カーネルモジュールの管理
/lib/modules/<kernel-version>/
配下に置かれる# ll /lib/modules/3.10.0-693.11.1.el7.x86_64/kernel/ 合計 16 drwxr-xr-x. 3 root root 17 12月 25 2017 arch drwxr-xr-x. 3 root root 4096 12月 25 2017 crypto drwxr-xr-x. 69 root root 4096 12月 25 2017 drivers drwxr-xr-x. 26 root root 4096 12月 25 2017 fs drwxr-xr-x. 3 root root 19 12月 25 2017 kernel drwxr-xr-x. 4 root root 249 12月 25 2017 lib drwxr-xr-x. 2 root root 35 12月 25 2017 mm drwxr-xr-x. 33 root root 4096 12月 25 2017 net drwxr-xr-x. 11 root root 162 12月 25 2017 sound drwxr-xr-x. 3 root root 17 12月 25 2017 virt
- カテゴリごとに存在
拡張子は
.ko
カーネルモジュール操作コマンド
カーネルパラメータ
- カーネルパラメータを変更した場合には、
/etc/sysctl.conf
や/etc/rc.local
にて起動時に変更が反映されるようにする - sysctl
ビルド
- コンパイルや、ライブラリのリンクを実施して実行可能なプログラムを作ること
- nice コマンドを利用することでタスクの優先順位を変更することが可能
タスクスケジューラ
- CPU の利用時間を分割して複数のプロセスに分与
- CFS(Completely Fair Scheduler)
- 各タスクの CPU 使用時間を n (ナノ) 秒精度で管理し、どのタスクも均等に CPU を使用できるようにするタスクスケジューラ
- autogroup スケジューリング
実行中のタスクを自動的にグループ分けして、各グループに対して均等に CPU 時間を割り当てる機能
CFS だとすべてのタスクに均等に CPU 時間を割り当てるため、サーバープログラム配下のタスクが増えれば増えるほど、他のタスク(GUI アプリケーション) に割り当てる CPU 時間は少なくなるのでそれを解消するために
現状値
# cat /proc/sys/kernel/sched_autogroup_enabled 0
- 0 は無効
- 1 は有効
/proc
配下
- カーネル内部の情報を
擬似的
に、ディレクトリで分けられたファイルとして見せているもの
/proc/sys/fs/*
- fs.file-max
- ファイルシステムでのオープンファイルの上限確認
デバイス管理
parameter
- kernel.panic
- カーネルパニック時に再起動するまでの秒数
vm.swappiness
- システムがスワップを行う程度の制御
- 10 くらいが良い
net.ipv4.tcp_fin_timeout
- FIN のタイムアウト値(秒)
- 5 秒より短い時間でタイムアウトするように設定
net.ipv4.ip_local_port_range
- 外に向かう接続におけるローカルポートの範囲
- 16384 - 65535 を使うよう設定
net.ipv4.tcp_orphan_retries
- こちら側からクローズした TCP コネクションを終了する前の再送回数
- リソースの消費を防ぐため 2 に設定する。
net.ipv4.tcp_tw_reuse
- TIME_WAIT 状態のコネクションを再利用するかどうか
- 1(再利用する)に設定
net.ipv4.tcp_max_tw_buckets
- システムが同時に保持する time-wait ソケットの最大数
- メモリ量に応じて調節するが 65535 ぐらいにしておく
net.ipv4.tcp_rmem
- TCP 受信バッファサイズ。[min, default, max] の順番
- 理想値
- :
net.ipv4.tcp_wmem
- TCP 送信バッファサイズ。[min, default, max] の順番
- 理想値
- :
fs.file-max
- オープン可能なファイル数の上限
- 65536 以上に設定
net.core.somaxconn
- TCP の LISTEN Backlog
- 2048 以上に設定
- TCP ソケットは listen() 関数の第二引数 backlog に指定した数の、完全に確率された接続要求を待ち受けることができるキューを作成
- キューがいっぱいになった状態で新たに接続要求を受け取ると、サーバーは ECONNREFUSED を返す
- 下位層のプロトコルが再送信をサポートしていれば、ECONNREFUSED は無視され、リトライが成功するかもしれません
- net.core.somaxconn は TCP ソケットが受け付けた接続要求を格納する、キューの最大長
- backlog > net.core.somaxconn のとき、キューの大きさは暗黙に net.core.somaxconn に切り詰められる
- net.core.somaxconn の影響
- net.core.somaxconn は OS レベルの接続キューの最大長として、TCP ソケットで待ち受けるサービス全般に影響を与える
- 具体的には、アプリケーションレベルで指定した接続キューの最大長 > net.core.somaxconn の場合、接続キューの大きさは暗黙にnet.core.somaxconnに切り詰められている可能性がある
- 最大数には、1 から 2147483647 までを指定可
- 本ディレクティブの設定値は、MaxClients ディレクティブで設定したクライアントの同時接続数よりも多くの接続要求があった場合に、Linux システム内にキューイングされる数として有効
- 本ディレクティブの設定値が Linux システムに設定されている待機中 TCP コネクションの最大値(/proc/sys/net/core/somaxconn)よりも大きい場合は、待機中 TCP コネクションの最大値が有効
net.core.netdev_max_backlog
- カーネルがキューイングするパケットの最大個数
- 2048 以上に設定
net.ipv4.tcp_max_syn_backlog
- SYN パケットを送った際に SYN/ACK の応答待ちに使うソケットの最大数
- 2048 以上に設定
/sys/class/net//queues/rx-/rps_cpus
/sys/class/net//queues/rx-/rps_flow_cnt
net.core.rps_sock_flow_entries
- グローバルフローテーブルのエントリ数
- アクティブな接続の最大数ぐらいに設定
- 推奨値は 32768
システムコール、スーパバイザコール
- プロセス/スレッドからカーネルへの処理依頼するためのインタフェース
- ハードウェアとの直接操作することができないので、カーネル経由で処理を依頼する
- 例
- open
- read
- write
ライブラリ
- 関数がたくさん記載されたファイル
- 関数の利用 =
リンク
- ライブラリ関数
- printf()
- exit()
- 標準 C ライブラリ
libc
# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) # ll /lib64/libc.so -rw-r--r--. 1 root root 253 10月 30 16:55 /lib64/libc.so
- 普段使われているのは GNU libc(glibc)
API(Application Programming Interface)
- 何かを使ってプログラミングするときのインタフェース
- ライブラリの API
- 関数
- マクロ
- カーネルの API
- システムコール
ストリーム
- バイト列が流れる通り道
- FILE 型の値
- STREAMS カーネルモジュール
- POSIX IPC
- ストリームを使わないプロセス間通信機構
省電力
システムの処理状況に応じて、省電力処理を実施する
- CPU の動作モードを省電力モードに切り替える
- CPU の動作クロックを調整する
- CPU を停止させるサスペンドやハイバネーションなどのシステム休止モードに移行する
C ステート
- CPU の動作モード
- powertop
CPUfreq
- CPU の動作クロックを制御
- クロック制御ポリシー(governor)
ondemand
- システム負荷に合わせてクロック周波数を上下
performance
- 常に最高クロック周波数
powersave
- 常に最低クロック周波数
ハイバネーション
- CPU の実行状態や主メモリのデータを記録装置に一時保存して、 PC の電源を落とす節電機能