Archive for the ‘工具类’ Category

在Linux操作系统中,有一个系统软件包,它的功能类似于Windows里面的“添加/删除程序”,但是功能又比“添加/删除程序”强很多,它就是Red Hat Package Manager(简称RPM)。此工具包最先是由Red Hat公司推出的,后来被其他Linux开发商所借用。由于它为Linux使用者省去了很多时间,所以被广泛应用于在Linux下安装、删除软件。下面就给大家介绍一下它的具体使用方法。

1.我们得到一个新软件,在安装之前,一般都要先查看一下这个软件包里有什么内容,假设这个文件是:Linux-1.4-6.i368.rpm,我们可以用这条命令查看:

rpm -qpi Linux-1.4-6.i368.rpm

系统将会列出这个软件包的详细资料,包括含有多少个文件、各文件名称、文件大小、创建时间、编译日期等信息。

2.上面列出的所有文件在安装时不一定全部安装,就像Windows下程序的安装方式分为典型、完全、自定义一样,Linux也会让你选择安装方式,此时我们可以用下面这条命令查看软件包将会在系统里安装哪些部分,以方便我们的选择:

rpm -qpl Linux-1.4-6.i368.rpm

3.选择安装方式后,开始安装。我们可以用rpm-ivh Linux-1.4-6.i368.rpm命令安装此软件。在安装过程中,若系统提示此软件已安装过或因其他原因无法继续安装,但若我们确实想执行安装命令,可以在 -ivh后加一参数“-replacepkgs”:

rpm -ivh -replacepkgs Linux-1.4-6.i368.rpm

4.有时我们卸载某个安装过的软件,只需执行rpm-e <文件名>命令即可。

5.对低版本软件进行升级是提高其功能的好办法,这样可以省去我们卸载后再安装新软件的麻烦,要升级某个软件,只须执行如下命令:rpm -uvh <文件名>,注意:此时的文件名必须是要升级软件的升级补丁

6.另外一个安装软件的方法可谓是Linux的独到之处,同时也是RMP强大功能的一个表现:通过FTP站点直接在线安装软件。当找到含有你所需软件的站点并与此网站连接后,执行下面的命令即可实现在线安装,譬如在线安装Linux-1.4-6.i368.rpm,可以用命令:

rpm -i ftp://ftp.pht.com/pub/linux/redhat/…-1.4-6.i368.rpm

7.在我们使用电脑过程中,难免会有误操作,若我们误删了几个文件而影响了系统的性能时,怎样查找到底少了哪些文件呢?RPM软件包提供了一个查找损坏文件的功能,执行此命令:rpm -Va即可,Linux将为你列出所有损坏的文件。你可以通过Linux的安装光盘进行修复。

8.Linux系统中文件繁多,在使用过程中,难免会碰到我们不认识的文件,在Windows下我们可以用“开始/查找”菜单快速判断某个文件属于哪个文件夹,在Linux中,下面这条命令行可以帮助我们快速判定某个文件属于哪个软件包:

rpm -qf <文件名>

9.当每个软件包安装在Linux系统后,安装文件都会到RPM数据库中“报到”,所以,我们要查询某个已安装软件的属性时,只需到此数据库中查找即可。注意:此时的查询命令不同于1和8介绍的查询,这种方法只适用于已安装过的软件包!命令格式:

rpm -参数 <文件名>

zz from: http://hi.baidu.com/mnkee/blog/item/efcb08467f4b950e6b63e538.html

————————————————-

改变默认安装路径:

首先用下面的命令查看一下该RPM包的默认安装目录,例如:

$ rpm -qpl ext3grep-0.10.0-1.el5.rf.i386.rpm
/usr/bin/ext3grep
/usr/share/doc/ext3grep-0.10.0
/usr/share/doc/ext3grep-0.10.0/INSTALL
/usr/share/doc/ext3grep-0.10.0/LICENSE.GPL2
/usr/share/doc/ext3grep-0.10.0/NEWS
/usr/share/doc/ext3grep-0.10.0/README

上面的命令列出了每一个文件即将被安装的位置,现在我们只需要重新用–relocate参数把安装目录定位一下就可以了:
rpm -i --relocate /usr/bin=/home/mysql/bin --relocate /usr/share/doc=/home/mysql/doc ext3grep-0.10.0-1.el5.rf.i386.rpm

全局性的vim配置可以写在.vimrc等配置文件里,而有的时候,希望针对某些特殊文件配置,也希望这些文件即使分发到其他人那里,也可以保留这些配置,这个时候,就需要vim modeline了!

在文件开头,或者最后,按照如下写法:

# vim: filetype=php

就可以把当前文件指定为php类型的文件。具体配置语法与vimrc没有区别。

具体参考:http://vim.wikia.com/wiki/Modeline_magic

cacti一款常用的图形化系统监控工具,今天在自己的虚拟机搭了一个试试,准备部署到服务器上。

尽量使用一个真实、单独的帐号运行cacti:sudo adduser cacti。

由于它依赖snmp、rrdtool等,所以这些都是需要装的:

通过yum安装:

net-snmp.i386 : 一个 SNMP 协议工具和库的集合。
net-snmp-devel.i386 : NET-SNMP 计划的开发环境。
net-snmp-libs.i386 : NET-SNMP 运行时间库。
net-snmp-perl.i386 : perl NET-SNMP 模块和 mib2c 工具。
net-snmp-utils.i386 : 来自 NET-SNMP 计划的,使用 SNMP 的网络管理工具。

通过rpm安装:

rrdtool-1.2.30-1.el4.wrl.i386.rpm  rrdtool-devel-1.2.30-1.el4.wrl.i386.rpm  rrdtool-perl-1.2.30-1.el4.wrl.i386.rpm

这三个rpm彼此之间有依赖关系,所以一定要一起安装:rpm -ivh rrdtool-*

具体安装过程可以参考官方文档:http://www.cacti.net/downloads/docs/html/install_unix.html

安装完毕之后,检查snmpd进程是否启动,如果没有,则手工启动之:sudo /sbin/service snmpd start

然后检查snmp是否正常启动:(如果出现大量输出,则正常)

snmpwalk -v 2c -c public 127.0.0.1 system

snmpwalk -v 2c -c public 127.0.0.1 if

如果异常,请修改/etc/snmp/snmpd.conf:

access  notConfigGroup “”      any       noauth    exact systemview none none

access  notConfigGroup “”      any       noauth    exact all none none

然后重启snmpd服务。

这时,进入cacti graph界面,如果不能出现图片,在firefox下可以看到,图片无法正常获取,可以看看apache log里是否有warning、notice等,因为cacti的图片由graph_image.php 生成,它声明header为png的图片,如果这时输出了文本信息,就会导致图片无法显示。或者关闭php的errorlog,或者修改一下cacti的代码:

lib/rrd.php 2023行:function rrdtool_function_graph($local_graph_id, $rra_id, $graph_data_array, &$rrdtool_pipe=null) {

这时,可能图片能显示,但是数据都是NAN,不要着急,因为cacti的数据来自rrdtool,而rrdtool需要一段时间养数据,等个10分钟左右,一般就会有数据了!

———————————————————————–
具体记录在服务器上安装cacti的过程,希望以一台服务器作为cacti server,监控多台服务器。

1、检查是否缺少软件:

[admin@v080049 ~]$ php -m | grep ‘mysql\|snmp\|gd\|session\|sockets’

gd mysql mysqli pdo_mysql session snmp sockets

[admin@v080049 ~]$ yum info net-snmp

[admin@v080049 ~]$ ps axu|grep snmpd

2、添加cacti用户:[root@v080049 ~]# adduser cacti

3、下载cacti源码,并解压,mv至web目录下

4、建立mysql相关:

[admin@v080049 cacti]$ mysqladmin -u root -p’×××××’ create cacti

root@(none) 05:15:09>grant all privileges on cacti.* to ‘cacti’@’localhost’ identified by ‘cactipwd’ with grant option; Query OK, 0 rows affected (0.01 sec)

[admin@v080049 cacti]$ mysql -u cacti -p’cactipwd’ cacti < cacti.sql

我汗,做到这里,突然发现,这个机器是合作方提供的vip组,我怎么定位到一台服务器上????

昨天,我们服务器交换机带宽占用率非常高,导致服务器访问延迟。

在这个时候,我尝试从其他3台机器进行了多次mysql远程连接尝试(期间还有几次打错了密码),现象是,客户端没有任何响应。在mysql server上查看,有一些连接处于connecting的状态,但是很快就断开了。

这时,使用netstat -anp|grep 3306,看到大量(400个左右)CLOSING状态的tcp连接。大致看了下,基本每个连接都是,server端向client端发送了61个包,而client仅向server发送了一个包。

5ae14aca4b0b61_

当时比较慌乱,没有细思考,采取了以下两种无效的方法:

1、重启了mysql服务器,之后连接仍然存在,而且连接所属的pid没了。如上所示。

2、service network restart,连接也还在

在网上搜索,可能关键词不对,也没有找到合适的解决方法。只好自己想,在过程中,使用过fuser、lsof等命令,查看使用file或tcp、udp端口的进程信息等, /sbin/sysctl -A 查看tcp的超时配置。

因为closing状态,是代表server和client同时发出关闭socket请求,我猜想,是因为网络阻塞,延时或丢包造成的。而我重启了mysql之后,与socket关联的进程消失了,socket处于无主的状态,只能等待超时或者系统回收了。

这时我的想法是,既然socket也是一种文件,是否我找到该临时文件,删除就好了,但是很郁闷,我没找到。

又,如果我在client机器上,用同样的端口连接,发送关闭FIN包,是否可以关闭该连接呢?用了nc命令,还是无效。猜测是因为对端已经没有用户进程管理这个端口了。

折腾了两个小时,很奇怪的是,突然间,这些closing的端口就消失了。我猜测,如果是超时,因为我在不同时间去尝试连接的,前后总有一二十分钟的差距,不过也没有太注意到这些端口是逐渐消失,还是同一时间消失的。另一种可能是,系统内部有回收进程,当socket资源不足、或者一段时间之后,就会触发回收机制,释放了这些端口。

不明白,但是系统很有意思。

附上socket状态转移图:http://www.night-ray.com/TCPIP_State_Transition_Diagram.pdf


最近做了一个项目,提交给性能测试结果如下:

List: TPS =3400
Detail: TPS =480

Detail页面 资源消耗大:  CPU idle75%, Load average:10

服务器配置为8g内存,4cpu,linux 2.6的核,lighttpd+php,本机跑了memcached。另有一台同样配置的服务器跑mysql。

由于对方要求load必须降下来,所以开始调优。

首先分析为什么load会大呢?vmstat查看io和阻塞都不大,但是system cs即上下文切换峰值为万数量级。top看了下内存占用率也正常。而load代表的含义是,cpu中正在执行的进程与等待执行进程的数目。它过大的原因,要不就是进程数太多,要不就是某些进程占用时间片太长。

先从代码入手,把detail静态信息做缓存,动态信息ajax异步加载。但其实测试环境下,mysql数据量并不大,这样优化没啥效果。

第二步,想会不会是lighttpd并发数不够,所以增大了PHP_FCGI_CHILDREN,使总共派生的php-cgi数目达到500.还是没进展,而且貌似偶尔还有小下降。这时查看lighttd的errorlog,发现有mysql too many connection的错误。

第三步,调整mysql的配置,将Max_connections配置到500,wait_timeout配置为1000,即增大可用连接,防止长连接。这时看着有所进步。

第四步,既然我的tps已经达到要求,而load过高,那么调整lighttpd的并发并没有好处,所以仍旧修改php-cgi数目为100。

第五步,将memcached迁移到mysql服务器上,因为该服务器cpu、内存使用都比较低。

再次测试,load降到了4以下!bingo!

ps:记录一些命令

查看cpu信息:grep ‘model name’ /proc/cpuinfo

据说load average的值保持在  Load Average < CPU个数 * 核数 *0.7 比较好!

这里有一篇文章,把load average说的很明白:http://www.gracecode.com/archives/2973/

context switch rate(上下文切换)的说明,节取自:http://blog.csdn.net/marising/archive/2010/01/12/5182771.aspx

就是Process(Thread)的切换,如果切换过多,会让CPU忙于切换,也会导致影响吞吐量。《高性能服务器架构 》这篇文章的第2节就是说的是这个问题的。究竟多少算合适?google了一大圈,没有一个确切的解释。Context Switch大体上由两个部分组成:中断和进程(包括线程)切换,一次中断(Interrupt)会引起一次切换,进程(线程)的创建、激活之类的也会引起一次切换。CS的值也和TPS(Transaction Per Second)相关的,假设每次调用会引起N次CS,那么就可以得出

Context Switch Rate = Interrupt Rate + TPS* N

CSR减掉IR,就是进程/线程的切换,假如主进程收到请求交给线程处理,线程处理完毕归还给主进程,这里就是2次切换。也可以用CSR、IR、TPS的值代入公式中,得出每次事物导致的切换数。因此,要降低CSR,就必须在每个TPS引起的切换上下功夫,只有N这个值降下去,CSR就能降低,理想情况下N=0,但是无论如何如果N >= 4,则要好好检查检查。

对于ligttpd来说,一个请求,先发送至lighttpd,然后交给fastcgi模块(这个模块是编译在ligttpd里的,不知道会不会导致cs切换),最后交给php-cgi,应该最终还会把处理结果返回给lighttpd,从而传送给用户。这样算来,一次请求至少导致2次cs切换。

这个文章不错,存之:http://blog.csdn.net/tianlesoftware/archive/2011/02/21/6198780.aspx

前两天对lighttpd+fastcgi(php)进行了压力测试,在我的破虚拟机上,对一个简单的php页面访问QPS是60+,而纯静态页面QPS是700+。

所以坚定了对部分关键页面静态化的决心。但是希望尽量不破坏网站原有逻辑,所以使用了bash来做。具体流程图如下:

静态化流程图

静态化流程图

触发静态化

我们的内容是由运营人员在后台发布的,所以当新增、修改、删除(相当于修改了产品的状态为deleted)的时候需要触发静态化。我的做法是插入一条新纪录到static_help表,该表的id是自增的。

cron判断是否需要静态化

该脚本定时运行,首先会检查本地文件static_flag.txt,其中保存了上次运行的static_help.id。如果static_help.id不存在或者为空,则需要重新静态化。然后curl’获取线上的动态内容首页,获取其中的js变量index(动态获取的max(static_help.id)),如果static_help.id > page.index,说明有新变动,则需要更新。

cron单例

为了避免多个cron同时运行,造成冲突,所以使用了以下简单的脚本,保证同一时刻仅有一个进程运行:

function LockFile() {
        [ -e /dev/shm/${0##*/} ] && errorexit "Self already Run!"
        ln -s /proc/$$ /dev/shm/${0##*/}
        trap "Exit" 0 1 2 3 15 22 24
}
function Exit(){
        unlink /dev/shm/${0##*/} >/dev/null 2>&1
        exit 0;
}

在程序中,首先调用LockFile函数,检查临时目录中是否存在以当前程序名称命名的link,如果存在则退出;否则建立该link。同时,为了保证程序中异常中断的时候也可以调用Exit函数释放link,使用trap函数注册了single的handle。在程序结束的时候,调用Exit函数。

cron获取待静态化内容

这里,为了尽量少的破坏现有代码的结构,在lighttpd中做了如下配置:

url.rewrite                = (
                "^/try/(?:\?(?:s=(\w+)&?)?(?:page=(\d+))?)?$" => "/static/try_$1_$2.htm", # pure static
)

这里我希望把http://127.0.0.1/try/?s=time&page=1重定向到/path/to/dir/static/try_time_1.htm,而htm文件是不经过fastcgi的。

通过以上配置可以看出,如果url不匹配该正则,就不会发生这样的重定向。所以为了获取动态内容,可以使用http://127.0.0.1/try/?s=time&page=1&v=dynamic类似的链接。

但是,这样的配置还有一个问题是,如果静态化失败,/path/to/dir/static/try_time_1.htm类似的文件不存在,则返回404error。待解决。

ajax加载动态内容

页面上肯定会有动态内容,比如访问数、用户相关信息等,这些可以使用ajax的方式动态加载。

这样就完成了整个静态化的步骤,附上完整的bash脚本:http://staticize-webpage.googlecode.com/files/static_listpage.tar.gz。

在godaddy上买了域名,但是DNS服务器是放在linode的(同时也租用了linode的虚拟机)。

配置一级域名,首先需要在godaddy上讲nameserver指向DNS server(即linode)。二级域名的配置就不需要这一步了,它会默认使用一级域名的DNS server。

如果这时还没配置一级域名,那么需要在DNS server(即linode)新建该域名(不带www的!!)。然后,点击进入该一级域名,为其添加A record,填写二级域名(如 test.flykobe.com)和服务器的ip地址。稍等一会就会生效。

如果生效前,访问者(本机)的浏览器访问过未生效的网址,可能需要清理浏览器到dns缓存。最好cmd ipconfig /flushdns清理下本机的缓存。

我们基于sina微博开发了一个应用。最近接到一个产品需求,针对我们的某些用户,发送新浪微博站内信。

本来是一个很简单的小需求,调用微博的几个api,判断是否符合filter条件,是则发送站内信。但是遇到以下几个问题:

1、新浪微博仅允许发送站内信给关注了“我”的人

2、微博api访问次数受限(http://open.t.sina.com.cn/wiki/index.php/Rate-limiting

针对第一个问题,我们从产品上做了一些调整,对于我们的活跃用户,请他们关注我们的官方帐号。并且在filter条件中增加了该relation的判断。

针对第二个问题,头就大了,我的app key是初级授权的:

默认REST API的访问限制是每小时150次,限制分用户和IP, 未授权的访问次数限制主要针对IP,登录后的请求访问限制主要针对用户。

普通授权限制情况:

  • 请求限制:单用户每小时150次
  • 发表微博:单用户每小时最大30次
  • 发表评论:单用户每小时最大60次
  • 发表私信:单用户每小时最大60次

最初,我就使用了同一个sina帐号,获取到oauth授权后,依次调用user/show, friends/exists,message/new接口,这样,在最坏情况下(就是filter都成功,并且发送mail),每个用户需要访问api 3次,假设有3w个用户,则共需调用api 9w次,按照以上限制,需要运行9w/150=23day!!!该效率显然不可接受。而且按照上面的说法,或许还加了ip限制,我们是小公司,服务器有限,如果一旦ip被封,后果不堪设想。所以想到利用新浪sae开放平台。

sae-sina-mail

sae-sina-mail

这里之所以做这种相对复杂的设计,也是因为SAE有每个http请求30sec的运行时间限制。所以,就需要把大的请求分割为小的,利用cron触发,并且利用task队列做一定的并发。

暨,这里,我们需要考虑到sina微博api 和 sae的两种限制!

为了突破微博api的限制,由于前面的filter并不一定要用官方帐号来做,所以注册了几个微博帐号,作为robot。而最终发送站内信必须用官方帐号,所以没办法,这里就要注意每小时60封信的限制。

index.php处理post数据,将userids文件分割为文件(每个文件1000行),拼装成sql句子,比如insert into table(a,b)values(1,2),(2,3),存储到sae的storage中,以特定的字符串为前缀命名。并且将发信的具体text、oauth token存储到mail_detail表中,获取其mail_id,作为sql句子中的数据。

cron_load每分钟运行一次,从storage中寻找特定的字符串为前缀命名的文件,读取其中的sql句子,执行。若成功,直接删除该文件。若失败,则删除该文件,将sql存储为其他字符串前缀命名的错误文件中。

cron_filter也是每分钟运行一次,获取所有可用的robots,调用http://api.t.sina.com.cn/account/rate_limit_status.json?source=接口可以获得该用户对应的访问状态。然后获取对应数目的待执行filter_target数据,与robot一一对应,生成task,存储到sae的taskqueue中。

filter.php作为task为调用,其传入参数包括filter_target_id和robot_name, robot_password,这里不使用sina微博的oauth sdk,因为oauth的获取太麻烦了,而是改用url加用户名、密码的方式:

function get_user_info_from_api($user_id, $no_login_user_name, $no_login_user_pwd){/*{{{*/
        $url = "http://api.t.sina.com.cn/users/show.json?source=".APP_KEY."&user_id=$user_id";
        $ret = request_without_login($no_login_user_name, $no_login_user_pwd, $url);
        return $ret;
}/*}}}*/

function request_without_login($user_name, $password, $url){/*{{{*/
        $s = curl_init(); 

        curl_setopt($s,CURLOPT_URL,$url);
        curl_setopt($s,CURLOPT_TIMEOUT, 30);
        curl_setopt($s,CURLOPT_RETURNTRANSFER,true);
        curl_setopt($s, CURLOPT_USERPWD, $user_name.':'.$password);
        curl_setopt($s,CURLOPT_HEADER,false); 

        $ret = curl_exec($s);
        if(curl_errno($s)){
                sae_debug("Can't run $url");
                return false;
        } 

        curl_close($s); 

        $ret_obj = json_decode($ret, true);
        if (isset($ret_obj['error_code'])){
                sae_debug("Run fail: $url, error:".$ret_obj['error']);
                return false;
        }

        return $ret_obj;
}/*}}}*/

如果filter条件成立,则生成mail_target存储到db中,等待之后的cron_mail进行处理。并更改filter_target的status为2(已处理不需要发信)或者3(已处理,需要发信).

cron_mail也是每分钟运行一次,从mail_target、mail_detail中获取发信的具体内容、token,并且以目标用户的名称拼接到发送文本前面,因为微博限制连续两封信不能同意内容,即使是发送给不同人的也不行。发送后,若失败,把失败原因存入mail_target。更新mail_target的status。

不过,sina的这些限制还确实是需要的,否则站骚就满天飞了。注大家站骚愉快,啦啦啦!

每次ssh连接到服务器,都会等待至少几秒钟。

刚开始怀疑是DNS解析的问题,但是换了ip直接连接,还是很慢。

又怀疑是网络问题,但是ping的速度还行。

使用ssh的debug模式:ssh -v *.*.*.*,看到连接在这里阻塞:

debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure.  Minor code may provide more information
No credentials cache found
debug1: Unspecified GSS failure.  Minor code may provide more information
No credentials cache found
debug1: Unspecified GSS failure.  Minor code may provide more information
No credentials cache found

既然这里反正验证不成功也可以登录,于是就去服务器上,把/etc/ssh/sshd_config 中的GSSAPIAuthentication改为no,并且reload了sshd服务。再次尝试,就很快了!

之后一周,希望可以实现以下简单的OPS方案,对我们的服务器进行初步的功能和性能监控。

Linux服务器性能监控

cpu、内存使用率、网络带宽、硬盘占用率, 利用sar,配合其他命令,间隔采样(比如1分钟),记录下来,暂时可以不形成图形。在达到某个峰值,要能够发邮件告警。(top、vmstat、iostat、netstat、iptraf、nethogs、uptime)

MySql数据库监控

每天将mysql的bin-log备份,可以暂时备份到我的私人服务器。怎样监控mysql的性能呢?看看slow log,定期分析哪些语句慢。尝试优化。

Lighttpd监控

脚本监控是否有lighttpd进程运行,cron定期wget指定页面,看是否正常访问,类似于heartbeat。也可以统计每个web页面平均耗时,有目的的优化。

memcached监控

脚本监控是否有memcached进程运行,定期查看其hit率。

硬盘备份

除了数据库之外,还需要将无法恢复的数据备份,比如code,应该是上传到svn服务器上的。而image也是需要备份的。

Log分析,监控pv

据说google analisy很好用,以后可以考虑使用。暂时做log分析,监控pv变化。

还有一些名词,记录下来备用。

smtp可以运行在待监控机器上,由其他监控程序收集它的数据,生成数据图。

cacti是一个很强大的图形化的监控工具。需要mysql、apache等配合,它作为数据中心。

nagios、mrgt也是图形化的监控工具。

BGP带宽,可以使网通和电信用户访问都很快。

做负载均衡,可以使应用层的,使用nginx、haproxy;也可以用tcp层的LVS。

一台服务器可以做硬盘阵列,不过这个我是真不懂。

sar常用参数总结

监控某个时间段内的cpu使用率
sar -u -f /var/log/sa/sa25 -s ’10:00:00′ -e ’14:30:00′
监控网络情况
sar -n DEV -f /var/log/sa/sa25  -s ’10:00:00′ -e ’15:00:00′
sar -n DEV -f /var/log/sa/sa25  -s ’10:00:00′ -e ’15:00:00′ | perl -n -e ‘if(m/eth0/){split; print $_[0].”,”.$_[1].”,”.$_[5].”\n”;}’
监控负载
sar -q 1 1
——————————————————————————
2011-6-16添加:

这两天察觉服务器较慢,正好分析了一下。

首先,使用top命令,进入top后,按cpu使用率排序(P),发现cpu经常逼近90%,这时mysql的cpu使用最高,能达到200%以上(不明白为什么会超过100%,多核的原因?暂时不发散去追究了)。

第二步,因为原来出现过网络带宽的问题(租用的服务器,共享带宽),所以使用sar -n DEV 5 100每隔5s运行一次、共运行100次,查看带宽使用情况。

flykobe@server ~ $ sar -n DEV 5 100

14时16分45秒     IFACE   rxpck/s   txpck/s   rxbyt/s   txbyt/s   rxcmp/s   txcmp/s  rxmcst/s

14时16分50秒        lo     49.80     49.80  27443.00  27443.00      0.00      0.00      0.00

14时16分50秒      eth0    353.60    467.80  41493.00 570056.20 0.00      0.00      0.00

14时16分50秒      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00

14时16分50秒      sit0      0.00      0.00      0.00      0.00      0.00      0.00      0.00

这里关心eth0的rxbyt/s   txbyt/s,即读入、写出字节数/秒。注意,这里的单位是byte,而服务器提供商给我们提供的网络带宽的单位是bit,需要做×8转换。这里的读写总带宽为5m,承受范围之内。

然后,再用iostat 5命令每隔5s运行一次,看看是否有io问题。发现即使是在cpu较忙碌的时候,iowait也不是很高,所以暂时排除是io问题。

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

13.01    0.00    7.20   12.36    0.00   67.43

最后,用sar -q 5 100每隔5s运行一次,查看负载情况,我们是4核的服务器,所以负载别持续超过4就ok了。

ok,那就集中考虑mysql的优化问题了

——————————————————

2011-9-7 添加

sar命令依靠sa來收集信息,存儲在/var/log/sa/目錄下。 该命令依靠cron运行:

flykobe@desktop happy_itry_v2 # cat /etc/cron.d/sysstat

# run system activity accounting tool every 10 minutes

*/10 * * * * root /usr/lib/sa/sa1 1 1

# generate a daily summary of process accounting at 23:53

53 23 * * * root /usr/lib/sa/sa2 -A