如何让服务器永不死机

编辑/etc/motd文件添加如下内容:

                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
           佛祖保佑       永不死机
           心外无法       法外无心 

Read more

[转]iptables规则的查看、添加、删除和修改

  1. 查看
  2. iptables -nvL –line-number
    -L 查看当前表的所有规则,默认查看的是filter表,如果要查看NAT表,可以加上-t NAT参数
    -n 不对ip地址进行反查,加上这个参数显示速度会快很多
    -v 输出详细信息,包含通过该规则的数据包数量,总字节数及相应的网络接口
    –line-number 显示规则的序列号,这个参数在删除或修改规则时会用到

  3. 添加
  4. 添加规则有两个参数:-A和-I。其中-A是添加到规则的末尾;-I可以插入到指定位置,没有指定位置的话默认插入到规则的首部。
    当前规则:
    # iptables -nL --line-number
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination
    1    DROP       all  --  192.168.1.1          0.0.0.0/0
    2    DROP       all  --  192.168.1.2          0.0.0.0/0
    3    DROP       all  --  192.168.1.4          0.0.0.0/0
    添加一条规则到尾部:
    # iptables -A INPUT -s 192.168.1.5 -j DROP
    再插入一条规则到第三行,将行数直接写到规则链的后面:
    # iptables -I INPUT 3 -s 192.168.1.3 -j DROP
    查看:
    # iptables -nL --line-number
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination
    1    DROP       all  --  192.168.1.1          0.0.0.0/0
    2    DROP       all  --  192.168.1.2          0.0.0.0/0
    3    DROP       all  --  192.168.1.3          0.0.0.0/0
    4    DROP       all  --  192.168.1.4          0.0.0.0/0
    5    DROP       all  --  192.168.1.5          0.0.0.0/0

    可以看到192.168.1.3插入到第三行,而原来的第三行192.168.1.4变成了第四行。

  5. 删除
  6. 删除用-D参数

    删除之前添加的规则(iptables -A INPUT -s 192.168.1.5 -j DROP):
    # iptables -D INPUT -s 192.168.1.5 -j DROP
    有时候要删除的规则太长,删除时要写一大串,既浪费时间又容易写错,这时我们可以先使用–line-number找出该条规则的行号,再通过行号删除规则。
    # iptables -nv --line-number
    iptables v1.4.7: no command specified
    Try `iptables -h' or 'iptables --help' for more information.
    # iptables -nL --line-number
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination
    1    DROP       all  --  192.168.1.1          0.0.0.0/0
    2    DROP       all  --  192.168.1.2          0.0.0.0/0
    3    DROP       all  --  192.168.1.3          0.0.0.0/0

    删除第二行规则
    # iptables -D INPUT 2

  7. 修改
  8. 修改使用-R参数
    先看下当前规则:
    # iptables -nL --line-number
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination
    1    DROP       all  --  192.168.1.1          0.0.0.0/0
    2    DROP       all  --  192.168.1.2          0.0.0.0/0
    3    DROP       all  --  192.168.1.5          0.0.0.0/0
    将第三条规则改为ACCEPT:
    # iptables -R INPUT 3 -j ACCEPT

    再查看下:
    # iptables -nL --line-number
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination
    1    DROP       all  --  192.168.1.1          0.0.0.0/0
    2    DROP       all  --  192.168.1.2          0.0.0.0/0
    3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
    
    第三条规则的target已改为ACCEPT。
附:

Iptables 中文指南 1.1.19(html)

Iptables 中文指南 1.2.2(pdf)

Read more

[fw]BogoMips micro-Howto

@beyes

calibrate_delay() 函数用来计算 BogoMIPS 的值。函数代码定义在 init/calibrate.c 中,如下所示:

/*
* This is the number of bits of precision for the loops_per_jiffy.  Each
* bit takes on average 1.5/HZ seconds.  This (like the original) is a little
* better than 1%
*/
#define LPS_PREC 8

void __devinit calibrate_delay(void)
{
	unsigned long ticks, loopbit;
	int lps_precision = LPS_PREC;

	if (preset_lpj) {
		loops_per_jiffy = preset_lpj;
		printk("Calibrating delay loop (skipped)... "
			   "%lu.%02lu BogoMIPS preset\n",
			   loops_per_jiffy/(500000/HZ),
			   (loops_per_jiffy/(5000/HZ)) % 100);
	} else if ((loops_per_jiffy = calibrate_delay_direct()) != 0) {
		printk("Calibrating delay using timer specific routine.. ");
		printk("%lu.%02lu BogoMIPS (lpj=%lu)\n",
			   loops_per_jiffy/(500000/HZ),
			   (loops_per_jiffy/(5000/HZ)) % 100,
			   loops_per_jiffy);
	} else {
		loops_per_jiffy = (1< < 12);
		printk(KERN_DEBUG "Calibrating delay loop... ");

		while ((loops_per_jiffy < < = 1) != 0) {
			/* wait for "start of" clock tick */
			ticks = jiffies;

			while (ticks == jiffies)
				/* nothing */;

			/* Go .. */
			ticks = jiffies;
			__delay(loops_per_jiffy);
			ticks = jiffies - ticks;

			if (ticks) {
				break;
			}
		}

		/*
		* Do a binary approximation to get loops_per_jiffy set to
		* equal one clock (up to lps_precision bits)
		*/
		loops_per_jiffy >
		>
			= 1;
		loopbit = loops_per_jiffy;

		while (lps_precision-- & & (loopbit > > = 1)) {
			loops_per_jiffy |= loopbit;
			ticks = jiffies;

			while (ticks == jiffies)
				/* nothing */;

			ticks = jiffies;
			__delay(loops_per_jiffy);

			if (jiffies != ticks) {  /* longer than 1 tick */
				loops_per_jiffy &
			}= ~loopbit;
		}

		/* Round the value and print it */
		printk("%lu.%02lu BogoMIPS (lpj=%lu)\n",
			   loops_per_jiffy/(500000/HZ),
			   (loops_per_jiffy/(5000/HZ)) % 100,
			   loops_per_jiffy);
	}
}

printk(KERN_DEBUG "Calibrating delay loop... ");
语句上面部分代码不需要关注,真正计算部分为下边的代码。现在来看看该函数时如何算出 BogoMIPS 值的。


loops_per_jiffy 变量顾名思义是每个 jiffy 中多少个 loops 循环 (关于 jiffy 概念可参考这里)。

loops_per_jiffy = (1<<12);
右移 12 位后, loops_per_jiffy 的值为 4096 。

while ((loops_per_jiffy <<= 1) != 0)
在 while 循环里 loops_per_jiffy 的值 x 2

ticks = jiffies;
while (ticks == jiffies)
/* nothing */;
ticks 变量用来保存当前的 jiffies 值。在底下的 while() 里,只要 ticks == jiffies ,那么就一直执行空语句(;)。换句话就是说,时钟节拍还没更新就一直执行空语句等待。

ticks = jiffies;
__delay(loops_per_jiffy);
OK,时钟节拍更新了(等时钟节拍更新是因为希望我们的计算有一个新的开始),那么我们开始执行 __delay() 函数(__delay() 函数不断对传进的 loops_per_jiffy 做减 1 运算,它是一小段汇编程序,具体分析参考这里)。

ticks = jiffies - ticks;
if (ticks)
	break;
当一个 __delay() 完毕后再检查一下 jiffies 值是否更新,如果相减的结果不为零,则表示更新了,这时就会跳出这个循环。如果没有更新,loops_per_jiffy 再乘以 2 从而加大 __delay() 的延迟时间。也就是说,通过不断的加大 __delay() 的时间而达到一个时钟节拍时间的粗略估算。


现在假设上面的循环已经推出,开始执行下面的语句。

loops_per_jiffy >>= 1;
这里 loops_per_jiffy 右移一位除以 2 的目的是修正上面的估算。
例如,我们假设一个时钟节拍所经过的时间为 t ,一个基本的 __delay() (对 4096 进行减 1 延迟所需要的时间)为 T1。再假设 t 的范围落在 2T1 < t < 4T1 。这里,我们会选择 2T1 ,目的是以 2T1 这个时间作为新的起点,然后根据下面的算法逐步的逼近 t 。
loopbit = loops_per_jiffy;
将 得到的 "新起点" loops_per_jiffy 保存到 loopbit 中。
while (lps_precision-- && (loopbit >>= 1)) {
	loops_per_jiffy |= loopbit;
从上面知道,lps_precision 的初始值为 8 ,这个值是一个精度。我们就是利用这个精度,从而不断的逼近 t 。

为了更清晰,逼近值见下表(新起点就设为 2T1,也就是 4096*2=8192,即二进制 10000000000000) :
10000000000000
11000000000000
10100000000000
10010000000000
10001000000000
10000100000000
10000010000000
10000001000000
上面就是一个逼近的规律了。每一次的逼近,就是  loopbit >>=1; ,然后 loops_per_jiff |= loopbit; 。

ticks = jiffies;
while (ticks == jiffies)
	/* nothing */;
ticks = jiffies;
__delay(loops_per_jiffy);
这一段代码和上面分析的一样。
if (jiffies != ticks) /* longer than 1 tick */
	loops_per_jiffy &= ~loopbit;
如果发现 jiffies 不等于 ticks 了,那就说明 jiffies 已经加 1,也就是说我们之前的 loops_per_jiffy 的值(上表中的一个)设大了。这不要紧,我们继续将其减小,然后再重复去测试。如果说,精度 8 已经减完了( lps_precision--) 还是达不到要求,那么我们也只好认为最低的精度(比如是 10000001000000 )就是所需要的值了。
从上面的分析我们可以发现,这样的计算方法并不是很精确的,但是至少可以让我们大概明了我们的 CPU 快到了什么样的程度。
printk("%lu.%02lu BogoMIPS (lpj=%lu)\n",
		 loops_per_jiffy/(500000/HZ),
		 (loops_per_jiffy/(5000/HZ)) % 100,
		 loops_per_jiffy);

计算 MogoMIPS 的方法:
BogoMIPS = loops_per_jiffy * HZ * 循环延迟所消耗指令

循环延迟是指 __delay() 这个循环,它的基本延迟就是 decl 和 jns 这两条指令。所以根据上面的公式有:

loops_per_jiffy * HZ * 2 / 1000000
底下除数 1000000 就是 MIPS ,表示 100W 条指令,所以又得到: loops_per_jiffy/(500000/HZ)

----------

作者:刘世伟    时间:2008-4-17 08:59

原帖由kliwei于 2008-4-17 08:26 发表
BogoMIPS                : 532.48
从这个可以看出来一些,
532.48/444*666=798

444是longson2e在666的bogomips
cpu的发射结构不变的话,这个比率也不会变。
张总在linux开发者大会上解释过为什么bogomips是主频的2/3
因为,bogomips其实就是最简单的循环的测试,其实是整数加法。因为龙芯的结构,不能实现加法结果马上被下一个加法作为被加数,造成延迟。

----------

BogoMips mini-Howto

Read more

[转]检测linux负载过高时重启php脚本

@rocdk890

当服务器的php-fpm经常搞得负载高,又找不到的原因的时候,只能写个脚本来帮忙检查负载并重启php,这也是没办法的事情.大家可以根据自己服务器的情况来决定要负载超过多少就重启php,我这里只设定了负载到1就重启php.

系统:centos 5.9 64位
脚本内容:
vi check-php.sh

#!/bin/sh
TOP_SYS_LOAD_NUM=1
SYS_LOAD_NUM=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`

echo $(date +"%y-%m-%d") `uptime`
if [ `echo "$TOP_SYS_LOAD_NUM < $SYS_LOAD_NUM"|bc` -eq 1 ]
then
	echo "#0#" $(date +"%y-%m-%d %H:%M:%S") "pkill php-fpm" `ps -ef | grep php-fpm | wc -l`
	/etc/init.d/php-fpm stop
	sleep 8
	pkill php-fpm
	sleep 8
	for i in 1 2 3
		do
		if [ `pgrep php-fpm | wc -l` -le 0 ]
		then
			/etc/init.d/php-fpm start
			sleep 30
			echo "#1#" $(date +"%y-%m-%d %H:%M:%S") "start php-fpm" `ps -ef | grep php-fpm | wc -l`
		fi
	done
else
	if [ `pgrep php-fpm | wc -l` -le 0 ]
	then
		/etc/init.d/php-fpm start
		sleep 30
		echo "#2#" $(date +"%y-%m-%d %H:%M:%S") "start php-fpm" `ps -ef | grep php-fpm | wc -l`
	fi
fi

定时执行

*/3 * * * * /root/shell/check-php.sh >>/var/log/check-php.log

如果你运行脚本出现:

: line 6: bc: command not found
: line 6: [: -eq: unary operator expected

表示没有bc命令,centos可以用

yum -y install bc
安装.

Read more

[转]解决远程登陆Linux误按ctrl+s锁屏

@rocdk890

很多刚从windows转移到linux上来工作的朋友,在用vi/vim编辑文件时,常常会习惯性的按下Ctrl+s来保存文件内容。殊不知这样按下去后面会造成整个终端不响应了,ssh连接还好说,直接关闭ssh连接再重新连接就可以了,但在服务器前使用的话,就只能眼睁睁的看着干着急,稍微懂点的就用alt+f2/3/4切换到其他控制台去操作了。 其实正确的方法是ctrl+q来解除锁定,ctrl+s在linux下是锁定屏幕显示的意思和ScreenLock键是一个效果,不信你试试按下ScrLk或者Fn+ScrLk。

如果不想再遇到的话,来把flow control整个关掉,同时ctrl+s可以解放出来用做readline历史搜索。

下面再多介绍点ctrl快捷键的知识:

  1. ctrl+c 结束正在运行的程序【ping、telnet等】
  2. ctrl+d 结束输入或退出shell
  3. ctrl+s 暂停屏幕输出
  4. ctrl+q 恢复屏幕输出
  5. ctrl+l 清屏,【是字母L的小写】等同于Clear

Read more