
# uptime
23:31:04 up 5 days, 10:20, 1 user, load average: 0.00, 0.01, 0.05
一般单核的CPU的话,负载到1证明系统已经运行比较满了,多核的话,有几个核就能到几。
但是,有没有仔细想过,这个负载值究竟可以有多高?
我们先用一个程序做下实验
等这个程序运行一会,再执行uptime看下负载
# uptime
23:44:53 up 5 days, 10:33, 2 users, load average: 16383.13, 14111.52, 7705.88
看到没,这个程序竟然把load神奇的刷到了16000这个级别,真是厉害,这个一下子似乎打破了对系统负载的认识。
原理是这样的,通过调用vfork产生指定数量的D状态的进程,从而提高负载。看看系统文档,是这样说的
vfork() differs from fork(2) in that the calling thread is suspended until the child terminates (either normally, by calling _exit(2), or abnormally, after delivery of a fatal signal), or it makes a call to execve(2). Untilthat point, the child shares all memory with its parent, including the stack.
vfork 的子进程只要不 execve 或者退出,父进程就一直挂着(在D状态)。这里就是让最后一个子进程用 scanf 等输入。
但是这个就是极限了吗?
程序员在这种事情上是不会停止追求的,下来再看一个终极版本的程序
执行一下
# stap -g loadavg.stp $(((1
看下效果
# uptime
23:48:19 up 5 days, 10:37, 2 users, load average: 9007199254740991.00, 14987.03, 9007199254740991.00
我天,这是要爆表了,终极load,系统要炸了吗?
不过,你知道其中的原理吗,vfork相当于还是利用了系统计算load的原理,通过增加D状态进程影响计算,这个终极版,则是直接修改计算过程中用到的参数,让系统算出一个极大值来,没有什么能够超越这个了。
在limits文件里把运行此程序的用户cpu设置成-1.limits可能存放在/etc/security/limits.
找不到你可以搜索一下
find / -name limits
来个快速上到100的for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`do dd if=/dev/zero of=/dev/null &done
说明:
cat /proc/cpuinfo |grep "physical id" | wc -l 可以获得CPU的个数, 我们将其表示为N.
seq 1 N 用来生成1到N之间的数字
for i in `seq 1 N`就是循环执行命令,从1到N
dd if=/dev/zero of=/dev/null 执行dd命令, 输出到/dev/null, 实际上只占用CPU, 没有IO *** 作.
由于连续执行N个(N是CPU个数)的dd 命令, 且使用率为100%, 这时调度器会调度每个dd命令在不同的CPU上处理.
最终就实现所有CPU占用率100%
另外,上述程序的结束可以使用:
1. fg 后按 ctrl + C (因为该命令是放在后台执行)
2. pkill -9 dd
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)