アルゴリズム
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
移動平均間隔が長いほど、値が大きいほど、現在の実行キューサイズが移動平均に与える影響が小さくなる傾向にあることがわかります。
なぜこの数字が選ばれるかというと、微積分の知識が関係しているので、生成される画像がより滑らかになります。