プロセススケジューラとは、システムに複数の実行可能プロセスが存在する場合に各プロセスへCPUリソースを割り当てるLinuxカーネルの機能である。
プロセススケジューラは、コンピュータの教科書では次のように説明される。
1つの論理CPU上で同時に動かせるプロセスは1つだけ
実行可能な複数のプロセスに、タイムスライスと呼ばれる単位で順番にCPUを使わせる
経過時間と使用時間
経過時間:
プロセスが開始してから終了するまでの経過時間
使用時間:
プロセスが実際に論理CPUを使用した時間
`time`コマンドを使ってプロセスを動かせば、対象プロセスの開始から終了までの経過時間と使用時間を得られる。

`real`は経過時間、`user`と`sys`は使用時間を示す。
`user`はプロセスがユーザランドで動作していた時間を指す。
`sys`はプロセスによるシステムコール発行の延長でカーネルが動作していた時間を指す。
`user`と`sys`の値は、情報取得対象のプロセスと、その終了済み子プロセスの値を合計したものである。
あるプロセスが子プロセスを生成し、その子プロセスらがそれぞれ別の論理CPU上で動作した場合は`real`の値よりも`user`+`sys`の値の方が大きくなり得る。
1つの論理CPUだけ使う場合
並列度が2倍、3倍になるに従って、経過時間も2倍、3倍になるが、使用時間はほぼ変わらない。
1つの論理CPU上で同時に1つしか処理できず、プロセススケジューラが各プロセスに順番にCPUリソースを与えているため。
複数の論理CPUを使う場合
一定の並列度まで、`real`と`user`+`sys`の値はほぼ同じになる。
各プロセスがそれぞれ論理CPUのリソースを独占できるため。
タイムスライス
タイムスライスとは、各プロセスがCPUを利用する際に割り当てられる時間のことである。
Linuxのスケジューラは`sysctl`の`kernel.sched_latency_ns`パラメータの値(ns単位)で示したレイテンシーターゲットと呼ばれる期間に一度CPUの時間を得られるようになっている。
各プロセスのタイムスライスは、
`kernel.sched_latency_ns / <論理CPU上で実行中または実行可能状態のプロセス数>` [ns]
である。
レイテンシーターゲットやタイムスライスの値の計算は、プロセス数が増えた場合やマルチコアCPUの場合はもう少し複雑で、次のような要素で変動する。
システムが搭載する論理CPU数
所定の値を超える論理CPU上で実行中/実行待ち中のプロセス数
プロセスの優先度を表すnice値
nice値は、プロセスの実行優先度を -20 から 19 までの間で設定する値(デフォルトは0)-20が一番優先度が高く、19が一番低い。
優先度を下げるのはどのユーザでもできるが、優先度を上げられるのはroot権限を持つユーザのみである。
nice値は`nice`コマンド、`renice`コマンド、nice()システムコール、setpriority()システムコールなどによって変更できる。
スケジューラはnice値が低い(優先度が高い)プロセスにタイムスライスを多く与える。
コンテキストスイッチ
コンテキストスイッチとは、論理CPU上で動作するプロセスが切り替わることである。
プロセスがいかなるコードを実行中でもタイムスライスが切れるとコンテキストスイッチが発生する。
性能について
論理CPU数よりもプロセス数を多くしても平均ターンアラウンドタイムが長くなるだけで、スループットは向上しない。
スループットは、プロセスの並列度が論理CPU数に等しくなるまでは向上する。
ターンアラウンドタイム:
システムに処理を依頼してから個々の処理が終わるまでの時間
スループット:
単位時間あたりに処理を終えられる数
論理CPUの数は`grep -c processor /proc/cpuinfo`コマンドで得られる。
論理CPUの数よりも多くプロセス数を増やしていくと、スケジューラが発生させるコンテキストスイッチが平均ターンアラウンドタイムを次第に長くし、スループットを下げていく。
Webアプリケーションなどで論理CPUの負荷が高い状況で新たな処理を要求されると平均ターンアラウンドタイムは長くなり、レスポンスタイムに影響し、結果ユーザ体験が損なわれてしまう。
そのため、応答性能重視のシステムは、スループット重視のシステムよりもCPU使用率を低めに抑える必要がある。