Linux Load编程竞赛 �C 后端技术 by Tim Yang
Linux load average的意思就是说 目前有ready的进程 但是cpu都在满,然后这个数是一分钟的平均值。公式:loadvg = tasks running + tasks waiting (for cores) + tasks blocked. 让CPU满是最简单的方式
为了更好理解load average,Tim某天在群征集一段代码使load average最高。于是乎,群友纷纷出手。
Linux load average的意思就是说 目前有ready的进程 但是cpu都在满,然后这个数是一分钟的平均值。公式:loadvg = tasks running + tasks waiting (for cores) + tasks blocked. 让CPU满是最简单的方式
为了更好理解load average,Tim某天在群征集一段代码使load average最高。于是乎,群友纷纷出手。
Shell版
#!/bin/sh for((i=0;i<10;i++));do { for((j=0;j<1000000000000;j++));do echo '1'>>1; done }& done
Ruby
ruby -e "require 'thread';t = Mutex.new;10.times {fork {10000000.times{t.synchronize {x=Time.now}}}}"
Java版本2
public class Test { public static void main(String[] args) { for (int i = 0; i < 1000; i++) { new Thread() { @Override public void run() { while (true) ; } }.start(); } } }
Java版本3
写两类线程,一类进行lockObject wait, 一类进行lockObject notifyall。 cpu上下文切换消耗 竞争激烈。Load能很高。
public class LoadHighDemo { public static void main(String[] args) throws Exception { LoadHighDemo demo = new LoadHighDemo(); demo.runTest(); } private void runTest() throws Exception { Object[] locks = new Object[5000]; for (int i = 0; i < 5000; i++) { locks[i] = new Object(); new Thread(new WaitTask(locks[i])).start(); new Thread(new NotifyTask(locks[i])).start(); } } class WaitTask implements Runnable { private Object lockObject = null; public WaitTask(Object obj) { lockObject = obj; } public void run() { while (true) { try { synchronized (lockObject) { lockObject.wait(new java.util.Random().nextInt(10)); } } catch (Exception e) {; } } } } class NotifyTask implements Runnable { private Object lockObject = null; public NotifyTask(Object obj) { lockObject = obj; } public void run() { while (true) { synchronized (lockObject) { lockObject.notifyAll(); } try { Thread.sleep(new java.util.Random().nextInt(5)); } catch (InterruptedException e) { } } } } }
Python版
把5分钟 load avg 稳定在1024了
在本群感到了一种情怀。。。
在本群感到了一种情怀。。。
#!/usr/bin/env python import os import sys import time def load_add_1(): time.sleep(30) fd=os.open("test.txt",os.O_CREAT|os.O_RDWR|os.O_SYNC, 0644) for i in xrange(10000*100): os.write(fd," "*100) sys.exit(0) for i in xrange(8192): if os.fork() == 0: load_add_1()
此版本将load跑到8192
Read full article from Linux Load编程竞赛 �C 后端技术 by Tim Yang