月份: 2012-08

关于sendmail发邮件出现由某某代发的解决方法

其实写这一篇文章是滥竽充数的,因为根本没有一个试验成功的方法。不过感觉大家的方法和思路还是对的,所以就先记录下来,也许是自己的系统有点bug吧,如果没有用人家的一键包的,可以自己尝试下,应该会有点思路,不保证可以哦,只是收集了网上的。

先来说一下情况,出现的可能是(由 root@localhost.localdomain 代发),这样的提醒。
1、更改hostname可以修改相应的localhost.localdomain为hostname。
2、如果不想改,可以通过在命令行发送的时候指定发件人地址

echo -e "To: xxxx@gmail.com" | sendmail -f user@XXX.com -t -i

或者

echo -e "To: xxxx@gmail.com\nFrom: user@XXX.com" | sendmail -t

那么收件箱显示的发件人是user@XXX.com

3、如果你是用php内置函数通过sendmail发送信件的话,可以在php.ini中修改:

sendmail_path = /usr/sbin/sendmail -fuser@XXX.com -t -i

注意-f和后面user@XXX.com中间没有空格。

上面出现root@localhost.localdomain中的root是这样解释的。sendmail发送邮件时,如果没有指定附加参数,默认它会把当前主机名作为邮件服务器、 以及命令它发邮件的Linux用户名作为发件者,加入到邮件头部信息。

如果不想修改网站程序,也可以通过设置php.ini来实现。在php.ini中设置sendmail_path为如下的形式:

sendmail_path = /usr/sbin/sendmail -t -i -f'user@XXX.com'

有网上的说,必须-f在前面,否则不生效,一直没有测试成功,所以也不确定。

另外大家可以搜一下”php_admin_value sendmail_path”,似乎这个东西也可以设置,不知道是不是虚拟主机用的。

详细如下:
php-fpm配置

php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f user@XXX.com //设置php mail发送

还有一个似乎是apache的虚拟主机设置,此处也可以设置sendmail_path。

将sendmail_path参数 在虚拟主机里面的设置:


    ServerAdmin admin@XXX.com
    DocumentRoot "F:/web/website/XXX/www/"
    ServerName www.XXX.com
    ErrorLog "logs/www.XXX.com-error.log"
    CustomLog "logs/www.XXX.com-access.log" common
    php_admin_value sendmail_path "F:/web/sendmail/sendmail.exe -t -i"

另外要注意的地方是sendmail_path只在unix下有效。不知道linux是不是有效?

用linux建立一个公网dns

首先介绍一下,dns服务器有三种类型。
一、转发dns
二、权威dns
三、非权威dns

建立步骤:

1、注册一个域名,建议在大的商家注册,不要在代理商注册,因为如果在代理商注册,域名转移将会是一个很痛苦的过程。

2、有一台服务器,具有固定IP。

3、在域名注册商注册dns服务器。此处不是说注册域名,而是在域名注册商处获得你的dns授权,即成为权威dns。godaddy的步骤如下:

(1)登陆 Account Manager。
(2)在 My Products 项目中, 点 Domain Manager。
(3)进入domain detail,拉到最下面,左边有一个 Host Summary 栏。
(4)点标题旁边的 add 连接。
(5)在 Host name 输入你的子域,例如你要创建ns1.moper.me,那就输入ns1。 注意: 不要设置”www”做为Dns的主机名。
(6)在 Host IP 里,输入IP地址,总共13个框,输入1个或多个。

一般.COM 和.NET是4~8小时生效,其他的域名为 24 到 48 小时生效。不过,一般5分钟左右就能查到这个DNS记录了。

最后你可以在http://www.internic.net/whois.html查询一下是否已经注册成功。

4、安装bind,本次搭建环境为centos6.2。
输入

yum -y install bind*

安装装所有关于bind的包。

5、设定bind
主要分为三部分

第一,设定/etc/named.conf

运行

cp /etc/named.conf /etc/named.conf.raw

复制一份默认的named.conf配置。

运行

vi /etc/named.conf

设定named.conf档案,档案内容如下:

options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { any; };
        recursion yes;
        allow-transfer  { none; };
        dnssec-enable yes;
        dnssec-validation yes;
        dnssec-lookaside auto;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};
zone "moper.me" IN {
        type master;
        file "named.moper.me";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

只设定了moper.me的正解析。

(2)设定named.ca
此档案在centos6.2里的bind已经自带了。当然您也可以使用最新的http://www.root-servers.org/

(3)设定正解析named.moper.me

vi /var/named/named.moper.me
$TTL    600
@ IN SOA  ns1.moper.me. admin.moper.me. (2013082502 3H 15M 1W 1D)
@ IN NS ns1.moper.me.
ns1.moper.me.  IN A XXX.XXX.XXX.XXX
@ IN MX 10 mxdomain.qq.com.
www.moper.me. IN A XXX.XXX.XXX.XXX

第一个XXX的IP是要作为dns1的IP,第二个xxx的IP是加一个A记录,即主机头www加域名解析到XXX这个IP。

配置完成,启动bind使配置生效。

/etc/init.d/named start
chkconfig named on

参考资料
http://linux.vbird.org/linux_server/0350dns.php
http://bbs.unixidc.com/read.php?tid=853
http://hzyevaxl.blog.163.com/blog/static/9353763200942710221763/

linux执行host命令出现command not found

我们查询DNS设置的时候常常会用到host命令,Centos5默认安装没有安装这个命令,当显示-bash: host: command not found的时候,我们就需要安装对应的包,才能使用host。host这个程序是包含在bind-utils包里面的,所以要先安装 bind-utils。

yum -y install bind-utils

服务器优盘安装windows系统

这几天忽然要在服务器上装win2003系统,没有光盘,比较纠结。在网上找了一个制作优盘安装盘的软件,测试可以正常安装。相信会装系统的人都会用这个软件,就不写过程了。

下载: Novicorp WinToFlash 0.7.0053 beta.zip

如果你是装win2008系列的,那么可以试试如下方法,此方法在win2003测试失败了,但是装linux是可以的,只是装完之后要改引导,不然就必须插着优盘系统才能启动,详见本博优盘安装linux的文章。

1、下载Ultraiso软件,选择【文件】,【打开】镜像。

2、【启动】下,【写入硬盘映像…】,选择【硬盘驱动器】(默认为U盘盘符,可选),点【写入】按钮。

3、写入完毕后,服务器开机进入bios设置,选择开机启动设备时候 选择对应U盘为首选。

5、重启,引导成功后按照正常顺序安装。

Rolling in the deep(小萝莉Angie Vazquez经典翻唱)

男女谈恋爱结婚—钱?

那些年,我们一起追过的电视剧

Page Cache和Buffer Cache的区别

在监控中开始对着两个Cache有点搞不清楚,后来查了下,弄清楚了它们的区别,都是Cache但完全不是缓存一种东西,很好区分。

磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。
假设我们通过文件系统操作文件,那么文件将被缓存到Page Cache,如果需要刷新文件的时候,Page Cache将交给Buffer Cache去完成,因为Buffer Cache就是缓存磁盘块的。
也就是说,直接去操作文件,那就是Page Cache区缓存,用dd等命令直接操作磁盘块,就是Buffer Cache缓存的东西。

转自http://www.penglixun.com/tech/system/the_diffrents_of_page_cache_and_buffer_cache.html

CPU负载的分析

最近对我的本本(4核8线程)用top命令看系统状况出现了CPU利用率超过200%的情况,非常诧异,查了下相关资料,把这个问题弄清楚了。
首先来分析下CPU Load

load average: 0.09, 0.05, 0.01

分别是1分钟、5分钟、15分钟的平均Load。
Load这个东西怎么理解呢,就像一条马路,有N个车道,如果N个进程进入车道,那么正好一人一个,再多一辆车就占不到车道,要等有一个车空出车道。
在CPU中可以理解为CPU可以并行处理的任务数,那么就是“CPU个数 * 核数”,如果CPU Load = CPU个数 * 核数 那么就是说CPU正好满负载,再多一点,可能就要出问题了,有任务不能被及时分配处理器,那么保证性能的话,最好是小于CPU个数 * 核数 *0.7。

查看CPU核数可以通过:grep ‘model name’ /proc/cpuinfo

那么以哪个平均值为准呢?如果1分钟平均出现大于CPU个数 * 核数的情况,还不用担心,如果5分钟平均也是,那就要警惕了,15分钟平均也是这样,就要分析哪里出问题了,防范于未然
CPU利用率超过100%的问题,也是差不多,top命令应该是把每个核的CPU占用率加起来,算一个和,于是多核情况下会出现超过100%。

另外Context Switch Rate也是个非常值得注意的值,因为线程间切换的代价也是非常高的。

引用一个公式:Context Switch Rate = Interrupt Rate + TPS* N

对于一个多线程的程序,我觉得准备一个控制线程来调度任务是非常必要的,免得线程过于高并发,导致资源的争用和线程切换带来性能问题,最好控制并发的线程数基本等于CPU的总核数,减少这个N,获得更好的处理器性能。

参考了如下几篇文章:
压力测试衡量CPU的三个指标:CPU Utilization、Load Average和Context Switch Rate
http://blog.csdn.net/marising/archive/2010/01/12/5182771.aspx

理解Load Average做好压力测试
http://www.blogjava.net/cenwenchu/archive/2008/06/30/211712.html

理解 Linux 的处理器负载均值
http://www.gracecode.com/archives/2973/

高性能服务器架构
http://blog.csdn.net/marising/archive/2010/01/13/5186643.aspx

转自http://www.penglixun.com/tech/system/cpu_load_analyse.html

Load和CPU利用率是如何算出来的

相信很多人都对Linux中top命令里“load average”这一栏困惑过,到底什么是Load,Load代表了什么含义,Load高会有什么后果?“%CPU”这一栏为什么会超过100%,它是如何计算的?
带着这些问题,我们通过一些测试,来探索下其中的不解之处。

首先,我们通过实验来大概确定其计算方式:
测试服务器:4核Xeon处理器
测试软件:MySQL 5.1.40
服务器上除了MySQL没有运行其他任何非系统自带软件。因为MySQL只能单线程运行单条SQL,所以可以很好的通过增加查询并发来控制使用的CPU核数。

空载时,top的信息为:

top – 14:51:47 up 35 days, 4:43, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 76 total, 1 running, 75 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 99.5%id, 0.1%wa, 0.2%hi, 0.2%si, 0.0%st

在数据库中启动一个大查询:

top – 15:28:09 up 35 days, 5:19, 3 users, load average: 0.99, 0.92, 0.67
Tasks: 80 total, 1 running, 79 sleeping, 0 stopped, 0 zombie
Cpu0 : 0.0%us, 0.0%sy, 0.0%ni, 96.3%id, 0.0%wa, 1.3%hi, 2.3%si, 0.0%st
Cpu1 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 98.7%us, 1.3%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

同时可以看到%CPU也是在100%

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
877 mysql 15 0 308m 137m 4644 S 99.9 6.8 15:13.28 mysqld

然后开启第二个大查询,不久就可以看到top信息的变化,Load到了2:

top – 15:36:44 up 35 days, 5:28, 3 users, load average: 1.99, 1.62, 1.08
Tasks: 80 total, 1 running, 79 sleeping, 0 stopped, 0 zombie
Cpu0 : 0.0%us, 0.0%sy, 0.0%ni, 97.7%id, 0.0%wa, 1.0%hi, 1.3%si, 0.0%st
Cpu1 : 99.0%us, 1.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 99.0%us, 1.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

也可以观察到%CPU增加到了200%:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
877 mysql 15 0 312m 141m 4644 S 199.8 7.0 22:31.27 mysqld

由此可以简单的做出如下临时结论:
1. %CPU是由每个核的CPU占用律之和算出来的。
2. load跟执行的任务数有关
不过要想准确的知道其含义,还是必须从源码入手。

CPU利用率的计算方法
下载busybox的源码,在procps目录下有top.c的源码,查看第293行附近(1.17.1版),可以看到

if (prev_hist_count) do {
        if (prev_hist[i].pid == pid) {
                cur->pcpu = cur->ticks - prev_hist[i].ticks;
                total_pcpu += cur->pcpu;
                break;
        }
        i = (i+1) % prev_hist_count;
        /* hist_iterations++; */
} while (i != last_i);

这就是计算%CPU的代码,很明显total_pcpu就是累加了每个线程对每个核的使用率,所以%CPU的最大值就是核数*100%。

而CPU利用率又是怎么计算的呢,跟踪代码可以发现,是从系统的/proc/stat这里读取的,这个文件的格式可以参考:http://www.linuxhowtos.org/System/procstat.htm,下面是我笔记本上读出来的内容。

plx@plinux-Laptop:~/busybox-1.17.1$ cat /proc/stat
cpu 520529 3525 658608 3500749 210662 6650 29698 0 0
cpu0 249045 1936 466387 1624486 136381 308 17051 0 0
cpu1 271483 1588 192221 1876263 74281 6342 12646 0 0
intr 84067574 42497789 41743 0 0 0 0 0 0 1 57928 0 0 7175 0 0 0 477092 24693 0 5 0 183 0 20 0 0 0 12455 821851 745906 10192555 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 142313984
btime 1281403521
processes 6707
procs_running 2
procs_blocked 0
softirq 56932805 0 20168080 9440286 238191 821787 0 10621375 4052209 13257 11577620

cpuN的含义从左到右分别是:user、system、nice、idle、iowait、irq、softirq,具体含义可以看文档。
在下面几行的含义是:
“intr”这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。
“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。
“btime”给出了从系统启动到现在为止的时间,单位为秒。
“processes (total_forks) 自系统启动以来所创建的任务的个数目。
“procs_running”:当前运行队列的任务的数目。
“procs_blocked”:当前被阻塞的任务的数目。
那么CPU利用率可以使用以下方法,先取两个采样点,然后计算其差值:

cpu usage=(idle2-idle1)/(cpu2-cpu1)*100 cpu usage=[(user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(total_2 - total_1)*100;

这是一段Bash代码采集利用率的,摘自网络:

#!/bin/sh
##echo user nice system idle iowait irq softirq
CPULOG_1=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
SYS_IDLE_1=$(echo $CPULOG_1 | awk '{print $4}')
Total_1=$(echo $CPULOG_1 | awk '{print $1+$2+$3+$4+$5+$6+$7}')
 
sleep 5
 
CPULOG_2=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
SYS_IDLE_2=$(echo $CPULOG_2 | awk '{print $4}')
Total_2=$(echo $CPULOG_2 | awk '{print $1+$2+$3+$4+$5+$6+$7}') 
 
SYS_IDLE=`expr $SYS_IDLE_2 - $SYS_IDLE_1`
 
Total=`expr $Total_2 - $Total_1`
SYS_USAGE=`expr $SYS_IDLE/$Total*100 |bc -l`
 
SYS_Rate=`expr 100-$SYS_USAGE |bc -l`
 
Disp_SYS_Rate=`expr "scale=3; $SYS_Rate/1" |bc`
echo $Disp_SYS_Rate%

还有一段Perl的代码,也是摘自网络:

#!/usr/bin/perl
use warnings;
 
$SLEEPTIME=5;
 
if (-e "/tmp/stat") {
	unlink "/tmp/stat";
}
open (JIFF_TMP, ">>/tmp/stat") || die "Can't open /proc/stat file!\n";
open (JIFF, "/proc/stat") || die "Can't open /proc/stat file!\n";
@jiff_0=;
print JIFF_TMP $jiff_0[0] ;
close (JIFF);
 
sleep $SLEEPTIME;
 
open (JIFF, "/proc/stat") || die "Can't open /proc/stat file!\n";  @jiff_1=;
print JIFF_TMP $jiff_1[0];
close (JIFF);
close (JIFF_TMP);
 
@USER=`awk '{print \$2}' "/tmp/stat"`;
@NICE=`awk '{print \$3}' "/tmp/stat"`;
@SYSTEM=`awk '{print \$4}' "/tmp/stat"`;
@IDLE=`awk '{print \$5}' "/tmp/stat"`;
@IOWAIT=`awk '{print \$6}' "/tmp/stat"`;
@IRQ=`awk '{print \$7}' "/tmp/stat"`;
@SOFTIRQ=`awk '{print \$8}' "/tmp/stat"`;
 
$JIFF_0=$USER[0]+$NICE[0]+$SYSTEM[0]+$IDLE[0]+$IOWAIT[0]+$IRQ[0]+$SOFTIRQ[0];
$JIFF_1=$USER[1]+$NICE[1]+$SYSTEM[1]+$IDLE[1]+$IOWAIT[1]+$IRQ[1]+$SOFTIRQ[1];
$SYS_IDLE=($IDLE[0]-$IDLE[1]) / ($JIFF_0-$JIFF_1) * 100;  $SYS_USAGE=100 - $SYS_IDLE;
 
printf ("The CPU usage is %1.2f%%\n",$SYS_USAGE);

Load的计算方法
跟踪busybox的代码可以知道,load是从/proc/loadavg中读取的。
我本机的一次抓取内容如下:

plx@plinux-Laptop:~/busybox-1.17.1$ cat /proc/loadavg
0.64 0.81 0.86 3/364 6930

每个值的含义依次为:
lavg_1 (0.64) 1-分钟平均负载
lavg_5 (0.81) 5-分钟平均负载
lavg_15(0.86) 15-分钟平均负载
nr_running (3) 在采样时刻,运行队列的任务的数目,与/proc/stat的procs_running表示相同意思
nr_threads (364) 在采样时刻,系统中活跃的任务的个数(不包括运行已经结束的任务)
last_pid(6930) 最大的pid值,包括轻量级进程,即线程。
假设当前有两个CPU,则每个CPU的当前任务数为0.64/2=0.32

我们可以在Linux内核中找到loadavg文件的源码:

tatic int loadavg_read_proc(char *page, char **start, off_t off,
                                 int count, int *eof, void *data)
{
        int a, b, c;
        int len;
#
 
        a = avenrun[0] + (FIXED_1/200);
        b = avenrun[1] + (FIXED_1/200);
        c = avenrun[2] + (FIXED_1/200);
        len = sprintf(page,"%d.%02d %d.%02d %d.%02d %ld/%d %d\n",
                LOAD_INT(a), LOAD_FRAC(a),
                LOAD_INT(b), LOAD_FRAC(b),
                LOAD_INT(c), LOAD_FRAC(c),
                nr_running(), nr_threads, last_pid);
        return proc_calc_metrics(page, start, off, count, eof, len);
}

以及计算load的代码:

#define FSHIFT      11          /* nr of bits of precision */
#define FIXED_1     (1<>= FSHIFT;
 
unsigned long avenrun[3];
 
EXPORT_SYMBOL(avenrun);
 
/*
* calc_load - given tick count, update the avenrun load estimates.
* This is called while holding a write_lock on xtime_lock.
*/
static inline void calc_load(unsigned long ticks)
{
        unsigned long active_tasks; /* fixed-point */
        static int count = LOAD_FREQ;
        count -= ticks;
        if (count < 0) {
                count += LOAD_FREQ;
                active_tasks = count_active_tasks();
                CALC_LOAD(avenrun[0], EXP_1, active_tasks);
                CALC_LOAD(avenrun[1], EXP_5, active_tasks);
                CALC_LOAD(avenrun[2], EXP_15, active_tasks);
        }
}

看了大师的文章,理解了这些代码。
所以可以明白:Linux的系统负载指运行队列的平均长度,也就是等待CPU的平均进程数。 Linux的系统负载指运行队列的平均长度,也就是等待CPU的平均进程数。因为Linux内禁止浮点运算,因此系统的负载只能通过计算变化的次数这一修正值来计算。Linux内核定义一个长度为3的双字数组avenrun,双字的低11位用于存放负载的小数部分,高21位用于存放整数部分。当进程所耗的 CPU时间片数超过CPU在5秒内能够提供的时间片数时,内核计算上述的三个负载。负载初始化为0,假设最近1、5、15分钟内的平均负载分别为 load1、load5和load15,那么下一个计算时刻到来时,内核通过下面的算式计算负载:

load1 -= load1 -* exp(-5 / 60) -+ n * (1 – exp(-5 / 60 ))
load5 -= load5 -* exp(-5 / 300) + n * (1 – exp(-5 / 300))
load15 = load15 * exp(-5 / 900) + n * (1 – exp(-5 / 900))

其中,exp(x)为e的x次幂,n为当前运行队列的长度。Linux内核认为进程的生存时间服从参数为1的指数分布,指数分布的概率密度为:以内核计算负载load1为例,设相邻两个计算时刻之间系统活动的进程集合为S0。从1分钟前到当前计算时刻这段时间里面活动的load1个进程,设他们的集合是 S1,内核认为的概率密度是:λe-λx,而在当前时刻活动的n个进程,设他们的集合是Sn内核认为的概率密度是1-λe-λx。其中x = 5 / 60,因为相邻两个计算时刻之间进程所耗的CPU时间为5秒,而考虑的时间段是1分钟(60秒)。那么可以求出最近1分钟系统运行队列的长度:

load1 = |S1| -* λe-λx + |Sn| * (1-λe-λx) = load1 * λe-λx + n * (1-λe-λx)

其中λ = 1, x = 5 / 60, |S1|和|Sn|是集合元素的个数,这就是Linux内核源文件shed.c的函数calc_load()计算负载的数学依据。

所以“Load值=CPU核数”,这是最理想的状态,没有任何竞争,一个任务分配一个核。
由于数据是每隔5秒钟检查一次活跃的进程数,然后根据这个数值算出来的。如果这个数除以CPU的核数,结果高于5的时候就表明系统在超负荷运转了。

转自http://www.penglixun.com/tech/system/how_to_calc_load_cpu.html