linux loadavg アルゴリズム
投稿者: biti_rainy
今日、CPU 負荷の計算方法について Linux のソースコードを読み、同時に Google であちこち検索して参考にしたのですが、長い間混乱していましたが、ついに計算を理解しました。 CPU 負荷の計算方法は、単純なモバイル算術平均ではありません。
Linux の場合、サンプリング計算のロード時間間隔は 5 秒で、これはソース コードで定義された固定数値であり、そのサンプリング構造により、動的メモリ ファイル システム /proc/loadavg および他のツールの出力を通じてタイムリーなデータを動的に取得できます。 uptime/top/sar などはすべてメモリ データを読み取ることによって生成されます。ここでは主にカーネル アルゴリズムに焦点を当てます。
5 秒間隔で、CPU ステータス データ、つまり実行キュー サイズが動的にサンプリングされます。これには、CPU で実行中のプロセスの数と CPU 待機キュー内のプロセスの数が含まれます。 Linux の場合、実際には 1 分、5 分、15 分の移動平均が計算されます。これを行うには、まず Linux で定義されている 3 つの定数を導入する必要があります:
#define EXP_1 1884 /* 1/exp(5sec/1min) */
#define EXP_5 2014 /* 1/exp(5sec/5min) */
#define EXP_15 2037 /* 1/exp(5sec/15min) */
3 つの定数はそれぞれ 1/5/15 分の定数を表します。計算方法は次のとおりです。
1884 = 2048/(power(e,(5) /(60* 1)))) /* e = 2.71828 */
2014 = 2048/(power(e,(5/(60*5))))
2037 = 2048/(power(e,(5/ (60*15) ))))
直前の時点で定数 1884 に従って計算された負荷がload1(t-1)、現在のサンプリング実行キューのサイズがrq1であると仮定すると、現在のload1(t) = ((load1(t-1) * 1884) + rq1 * (2048 - 1884))/2048
同様に、5 分および 15 分の移動平均に使用できるアルゴリズムは次のとおりです。load5(t) = (( load5(t-1) * 2014) + rq1 * (2048 - 2014) )/2048 およびload_15(t) = ((load15(t-1) * 2037) + rq1 * (2048 - 2037))/2048