Linux操作系统中关于负载的定义

男主人zkw

男主人zkw

2016-02-20 13:24

有了下面这个Linux操作系统中关于负载的定义教程,不懂Linux操作系统中关于负载的定义的也能装懂了,赶紧get起来装逼一下吧!

使用uptime或者top命令,都可以看到一个负载的输出,形如load average: 0.00, 0.03, 0.00,这个负载到底是什么东西呢,man文档里只是一笔带过,没有具体的给出负载的定义。

  负载的统计,必然是由内核完成的,因此在内核源码中找答案是再好不过的事情了,找来2.6.21的内核源码,开始探索。

  节选部分源码:

//kernel/timer.c


1254 active_tasks = count_active_tasks();

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/diannaorumen/)

1256 CALC_LOAD(avenrun[0], EXP_1, active_tasks);
1257 CALC_LOAD(avenrun[1], EXP_5, active_tasks);
1258 CALC_LOAD(avenrun[2], EXP_15, active_tasks);


//include/linux/sched.h

 110 #define FSHIFT      11      /* nr of bits of precision */
 111 #define FIXED_1     (1 112 #define LOAD_FREQ   (5*HZ)      /* 5 sec intervals */
 113 #define EXP_1       1884        /* 1/exp(5sec/1min) as fixed-point */
 114 #define EXP_5       2014        /* 1/exp(5sec/5min) */
 115 #define EXP_15      2037        /* 1/exp(5sec/15min) */

 117 #define CALC_LOAD(load,exp,n)
 118     load *= exp;
 119     load += n*(FIXED_1-exp);
 120     load = FSHIFT;

 
  load(t) = ( load(t-1)*exp(i) + n(t)*(2048-exp(i)) ) / 2048

  load(t-1)为上次计算出的结果

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/diannaorumen/)

  n(t)为t时刻的活动进程数

  计算方式是累加各个CPU的运行队列中running和uninterruptible的值 再乘以2048

  计算方式如下:

  1946 unsigned long nr_active(void) 1947 { 1948 unsigned long i, running = 0, uninterruptible = 0; 1949 1950 for_each_online_cpu(i) { 1951 running += cpu_rq(i)-nr_running; 1952 uninterruptible += cpu_rq(i)-nr_uninterruptible; 1953 } 1954 1955 if (unlikely((long)uninterruptible 0)) 1956 uninterruptible = 0; 1957 1958 return running + uninterruptible; 1959 }

  1226 static unsigned long count_active_tasks(void) 1227 { 1228 return nr_active() * FIXED_1; 1229 }

  exp(1) = 1884 exp(5) = 2014 exp(15) = 2037 exp(i) = 2048 * e^(-1/12/i)

  从本质上看负载是完全由过去的一段时间里每个CPU上的活动进程数决定的,但并不是在数值上等同于每秒钟需要进行调度的进程数,具体的计算过程是个比较复杂的过程。

展开更多 50%)
分享

猜你喜欢

Linux操作系统中关于负载的定义

电脑入门
Linux操作系统中关于负载的定义

Linux操作系统中的文件管理技巧

电脑入门
Linux操作系统中的文件管理技巧

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Linux操作系统内核中工作队列的操作

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
Linux操作系统内核中工作队列的操作

在linux操作系统中如何截获系统调用

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
在linux操作系统中如何截获系统调用

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Linux操作系统中备份恢复技术的应用

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
Linux操作系统中备份恢复技术的应用

Linux操作系统中的7件武器详解

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
Linux操作系统中的7件武器详解

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

linux下的sendmail的配置

linux下的sendmail的配置

RedHat7.2下ADSL双网卡共享上网实战

RedHat7.2下ADSL双网卡共享上网实战
下拉加载更多内容 ↓