Archive for the ‘linux’ Category
Linux 服务器根据CPU负载及内存占用自动重启服务脚本
最近发现我的vps服务器经常无故cpu负载超过2,甚至达到4,影响网站访问,具体原因可能是php5-cgi的问题,但深层次的原因还没找到,为了让服务器能稳定运行,所以做个脚本能自动检测系统负载,但复杂很高的时候,自动重启有问题的程序
主要用于监控 linux 服务器负载及内存占用,如 MySQl、php-fpm,当负载或内存占用达到设置值后,便自动重启该进程以避免宕机。
# 设置最大内存占用百分比
PID_MEM_MAX=”85″
# 设置最大系统负载
SYS_LOAD_MAX=”1″
# 设置需要监控的服务名称
NAME_LIST=”php5-cgi mysql”
for NAME in $NAME_LIST
do
# 初始化内存统计
PID_MEM_SUM=0
# 获取该程序总进程数
PID_NUM_SUM=`ps aux | grep $NAME | wc -l`
# 列出每个进程内存占用百分比
PID_MEM_LIST=`ps aux | grep $NAME | awk ‘{print $4}’`
# 计算所有进程总内存占用
for PID_MEM in $PID_MEM_LIST
do
PID_MEM_SUM=`echo $PID_MEM_SUM + $PID_MEM | bc`
done
# 获取最近一分钟系统负载
SYS_LOAD=`uptime | awk ‘{print $(NF-2)}’ | sed ‘s/,//’`
# 比较内存占用和系统负载是否超过阀值
MEM_VULE=`awk ‘BEGIN{print(‘”$PID_MEM_SUM”‘>=’”$PID_MEM_MAX”‘?”1″:”0″)}’`
LOAD_VULE=`awk ‘BEGIN{print(‘”$SYS_LOAD”‘>=’”$SYS_LOAD_MAX”‘?”1″:”0″)}’`
# 如果系统内存占用和系统负载超过阀值,则进行下面操作。
if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then
# 写入日志
echo $(date +”%y-%m-%d %H:%M:%S”) “killall $NAME” “(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)”>> /var/log/autoreboot.log
# 正常停止服务
/etc/init.d/$NAME stop
sleep 3
# 强制关闭
pkill $NAME
# 重启
/etc/init.d/$NAME start
#写入日志
echo $(date +”%y-%m-%d %H:%M:%S”) “start $NAME” “(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)” >> /var/log/autoreboot.log
else
echo “$NAME very health!(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)” > /dev/null
fi
done
以上代码保存为一个文件,例如:auto_reboot.sh
添加计划任务,设置每分钟检查一次
crontab -e
* * * * * /bin/bash/root/auto_reboot.sh
注意文件的位置要搞正确。
请确保您的Linux系统中已经安装了bc,否则会出现错误。查看是否安装了bc可以使用命令:
1
bc -v
如果没有安装,centos可以用 yum -y install bc 安装它
可以使用命令
1
sh /bin/bash/root/auto_reboot.sh
测试以上脚本,如果出现 syntax error near unexpected token `do 这样的错误请查看本站文章《Linux 下sh脚本执行时出现 syntax error near unexpected token `do 错误的解决方法 》一文。
CentOS VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本:
#!/bin/sh
#usage: */2 * * * * root /root/checkload.sh
# [CentOS]VPS服务器根据CPU负载及内存占用自动重启脚本
# 设置最小剩余内存,一般至少要剩余50M可用(单位兆)
FREE_MEM_MIN=”50″
# 设置最大系统负载
SYS_LOAD_MAX=”3″
# 设置重启服务的最小剩余内存(单位兆)
RESTART_FREE_MEM_MIN=”500″
# 设置需要监控的服务名称
NAME_LIST=”httpd mysqld”
for NAME in $NAME_LIST
do
# 获得剩余内存(单位兆)
FREE_MEM=`free -m|grep Mem|awk ‘{print $4}’`
# 获得已用内存(单位兆)
#FREE_MEM=`free -m|grep Mem|awk ‘{print $3}’`
# 获取最近一分钟系统负载
SYS_LOAD=`uptime | awk ‘{print $(NF-2)}’ | sed ‘s/,//’`
# 比较内存占用和系统负载是否超过阀值
MEM_VULE=`awk ‘BEGIN{print(‘”$FREE_MEM”‘<’”$FREE_MEM_MIN”‘?”1″:”0″)}’`
LOAD_VULE=`awk ‘BEGIN{print(‘”$SYS_LOAD”‘>=’”$SYS_LOAD_MAX”‘?”1″:”0″)}’`
# 测试结果
#LOAD_VULE=”1″
#echo $(date +”%y-%m-%d %H:%M:%S”) “DEBUG $NAME” “(FREE_MEM:$FREE_MEM|$MEM_VULE,LOAD:$SYS_LOAD|$LOAD_VULE)”>> /var/log/autoreboot_debug.log
# 如果系统内存占用和系统负载超过阀值,则进行下面操作。
if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then
# 写入日志
echo $(date +”%y-%m-%d %H:%M:%S”) “killall $NAME” “(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)”>> /var/log/autoreboot.log
# 正常停止服务
service $NAME stop
sleep 3
# 强制关闭
skill $NAME
# 重启
sleep 10
for i in 1 2 3
do
FREE_MEM=`free -m|grep Mem|awk ‘{print $4}’`
MEM_VULE=`awk ‘BEGIN{print(‘”$FREE_MEM”‘>=’”$RESTART_FREE_MEM_MIN”‘?”1″:”0″)}’`
if [ `pgrep $NAME | wc -l` -le 0 ] && [ $MEM_VULE = 1 ]
then
service $NAME start
sleep 15
echo “AutoStart:” $(date +”%y-%m-%d %H:%M:%S”) “start $NAME” `ps -ef | grep $NAME | wc -l` > /var/log/autoreboot.log
fi
done
# 写入日志
echo $(date +”%y-%m-%d %H:%M:%S”) “start $NAME” “(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)” >> /var/log/autoreboot.log
else
MEM_VULE=`awk ‘BEGIN{print(‘”$FREE_MEM”‘>=’”$RESTART_FREE_MEM_MIN”‘?”1″:”0″)}’`
if [ `pgrep $NAME | wc -l` -le 0 ] && [ $MEM_VULE = 1 ]
then
service $NAME start
sleep 15
echo “AutoStart:” $(date +”%y-%m-%d %H:%M:%S”) “start $NAME” `ps -ef | grep $NAME | wc -l` > /var/log/autoreboot.log
else
echo “$NAME very health!(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)” > /dev/null
fi
fi
done
充分利用linode的4核cpu
我的Linode十分繁忙,在跑一些密集操作数据库的Rake任务时尤其如此。但我观察发现,Linode服务器的4核CPU,只有第1个核心(CPU#0)非常忙,其他都处于idle状态。
不了解Linux是如何调度的,但在Linode的这种状态下,显然有优化的余地。除了处理正常任务,CPU#0还需要处理各种中断。因此,若能将CPU#0分担的任务摊派到其他CPU核心上,可以预见,系统的处理能力将有更大的提升。
两个名词
SMP (Symmetrical Multi-Processing):指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。
CPU affinity:中文唤作“CPU亲和力”,是指在CMP架构下,能够将一个或多个进程绑定到一个或多个处理器上运行。
一、在Linux上修改进程的“CPU亲和力”
在Linux上,可以通过 taskset 命令进行修改。以Ubuntu为例,运行如下命令可以安装taskset工具。
# apt-get install schedutils
对运行中的进程,文档上说可以用下面的命令,把CPU#1 #2 #3分配给PID为2345的进程:
# taskset -cp 1,2,3 2345
但我尝试没奏效,于是我关掉了MySQL,并用taskset将它启动:
# taskset -c 1,2,3 /etc/init.d/mysql start
对于其他进程,也可如此处理(nginx除外,详见下文)。之后用top查看CPU的使用情况,原来空闲的#1 #2 #3,已经在辛勤工作了。

二、配置nginx绑定CPU
刚才说nginx除外,是因为nginx提供了更精确的控制。
在conf/nginx.conf中,有如下一行:
worker_processes 1;
这是用来配置nginx启动几个工作进程的,默认为1。而nginx还支持一个名为worker_cpu_affinity的配置项,也就是说,nginx可以为每个工作进程绑定CPU。我做了如下配置:
worker_processes 3; worker_cpu_affinity 0010 0100 1000;
这里0010 0100 1000是掩码,分别代表第2、3、4颗cpu核心。
重启nginx后,3个工作进程就可以各自用各自的CPU了。
三、刨根问底
- 如果自己写代码,要把进程绑定到CPU,该怎么做?可以用sched_setaffinity函数。在Linux上,这会触发一次系统调用。
- 如果父进程设置了affinity,之后其创建的子进程是否会有同样的属性?我发现子进程确实继承了父进程的affinity属性(其实用taskset启动进程就是一次fork+exec)。
linode vps安装pptp vpn 常见错误解决
1:619错误
有些同学说要手动建立ppp文件,我觉得其实应该是检查iptables的NAT功能是否正常
用iptables -t nat -L 看看nat规则是否正常
有同学建议 mknod /dev/ppp c 108 0 但其实出现这问题的大部分都是本身已经存在这个文件会提示 mknod: `/dev/ppp’: file exists,如果你不敢确认,那就完全也可以先用rm删除这个设备文件,然后再建个
另外确认net.ipv4.ip_forward=1是否生效
2:800错误
一般是vpn服务器关闭了,或者停止了,如果你是用域名访问vpn,也有可能是dns的解析除了问题
3:还有一种情况:就是登录和验证都正常,但就是访问不了页面
这种情况我碰到很多次,但我至今没找到确切的问题所在,我初步也是怀疑iptables的转发没能正常工作
大家不妨多看看log日志分析一下
Ramhost KVM VPS 实战操作指南
ramhost的kvm服务器到底是怎么登录的,后台操作界面到底怎么用?
ramhost的kvm服务器很抢手哦,一上货就被抢的差不多,在经过漫长的等待后,终于等来了账户信息,刚刚接触ramhost的朋友可千万别着急,一般是3个工作日内会给你发含有账户信息的邮件,是工作日,所以周末是不算的。 拿到账户后,请登录kvm的专用后台,界面跟以前的openvz后台一模一样,呵呵。注意了邮件发给你的帐号只是登录后台的账户,不是服务器ssh登录用的,ssh登录必须我们安装完系统装完ssh服务才能登录使用,这点大家要搞清楚了
登录后,你服务器的ip地址,网关,子网掩码等都告诉你了,这个待会儿会在我们的安装过程中用到,一定要记住了,另外你看最右边,跟openvz不同的是多了一个Console,这个是一个java虚拟终端,我们待会儿的初始化安装都是需要通过这个来实现的

ramhost的kvm后台管理界面
好了,开始操作
1:首先我们要先选择操作系统,默认不选就是debian6 点击Reload OS,及有很多系统可以让我们选择,因为我买的是256M的最小的,所以我们选个debian-6.0.2.1-i386-netinst.iso 然后点击下面的按钮

在kvm后台选择需要安装的系统
2:选择完系统后,我们就可以返回Main Menu,需要进Console进行安装系统,点击进去后,我们会看到一个java虚拟终端窗口,即debian系统的开始安装界面。

KVM的java终端安装系统
安装过程我就不说了,大家可以参考这篇文章http://www.zijidelu.org/thread-317-1-1.html 注意:在填ip,网关,子网掩码的时候,按ramhost给你的填,dns直接填google的dns就行8.8.8.8,如果大家在安装过程中选择的国家是中国,那后面的镜像最好别选中国,选美国的就行,毕竟服务器在美国,速度会快点。 在软件包选择过程中,只要选择SSH Server,如果是debian5可能没这个选项,就要后期手动安装openssh服务 只有安装了ssh server,我们才能通过ssh的window终端登录 debian5 系统 手动安装 apt-get install openssh-server
安装完以后,为了安全,最好改一下端口和禁止root登录 3:好了,系统完成后,这时我们就可以通过putty或者SecurCRT登录你的服务器 注意登录地址是 管理首页给你的ip地址,用户名是你安装系统时候自己的用户名,也可以直接root,密码也是你安装系统的时候的密码。这点不要跟邮件给你的账户搞晕了,是2回事。 4.下一步就是初始化系统了,参考我的另外一篇文章http://www.5ilinux.com/2011/04/ramhostdebian.html
总结:
ramhost的KVM适合哪些用户?
1:对线路要求比较高的,ramhost的kvm机房走的是nlayer线路 而亚特兰大的openvz机房走的是tinet线路
2:学习各种linux版本安装经验的同学,如果你会装还不如直接用openvz或者xen提供的系统镜像,都优化的挺好的。
3:对ramhost的openvz部分闲置纠结的,比如不能pptp,不能自定义内核等,那好我们建议用KVM,否则的话还是别折腾了