什么样的程序让linux负载变大

什么样的程序让linux负载变大,第1张

在linux系统里面,常见的有两个地方可以看到当前系统的最近平均负载,top命令和uptime,如果执行一下uptime命令的话,可以看到有一个load average,表示最近1分钟,5分钟,15分钟的系统负载。

# 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


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8965751.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-23
下一篇2023-04-23

发表评论

登录后才能评论

评论列表(0条)

    保存