自动升级WordPress插件超时Operation timed out after 30

2009年6月2日 龙飞 2 条评论

默认情况下WordPress插件自动升级时候的超时是30秒,但是往往服务器网速的原因30秒没无法下载完成新的插件安装包导致提示超时:

正在从 http://downloads.wordpress.org/plugin/super-switch.1.3.zip 下载更新

下载失败。: Operation timed out after 30 seconds with 182448 bytes received

插件升级失败

要解决这个问题可以修改 wp-admin/includes/file.php

把$response = wp_remote_get($url, array(’timeout’ => 30));

30改成300 或 600 后再次自动升级成功了

分类: 软件相关 标签:

浅谈VI3升级到vSphere4的步骤

2009年5月30日 龙飞 没有评论

这篇文章是我学习和整理在用于我们单位VI3系统升级至vSphere4的一份学习总结,和升级指导,所有内容都是基于官网文章的个人理解,并非实际操作步骤,所以这里只作为浅谈,希望能够对我以及广大VI3用户在升级至vSphere4的时候有所帮助。我在正式升级完成后还会再抽空整理补充一下。

首先明确下这里所指的VI3是VirtualCenter、VMware Infrastructure Client、VMware Update Manager、VMware ESX/ESXi、Virtual Machines等等在内的一个整体平台,当然vSphere4也是和VI3这样所指的一个整体平台。

1.首先我们来把VI3和vSphere4所包含的组件来个新旧名称对比,这里只是简单的列举下升级中所涉及到的组件。
VI3 | vSphere4
VirtualCenter | vCenter Server
VMware Infrastructure Client | vSphere Client
VMware Update Manager则没有变划但是vSphere4中vSphere Client有一个Host Update Utility的工具可以用来升级esx
而license server在vSphere则被取消了,因为vSphere使用了key的方式替代VI3中的flex license方式。当然如果你需要用vCenter Server和vSphere Client来管理VI3的esx的话你还是需要license server。

2.接下来我们先了解下vCenter Server 4.0的需求。
vCenter Server 4.0的硬件需求:
CPU数量:至少2 CPUs,注意不是双核是2个物理CPU
CPU性能:至少2.0GHz Intel or AMD,如果数据库也在一台机器上的话CPU最好再强劲点。
内存:至少3GB,同样如果数据库也在一台机器上的话我想4GB是最起码的了。
硬盘空间:2GB,同样记得算上数据库的。
网络:至少千兆网络环境是必须的。

vCenter Server 4.0的环境需求:
vCenter Server 4.0需要本机的80,389,443,636,902,903,8080,8433,902(UDP)
先检查检查本机是不是有VirtualCenter之外的其他程序占用这些端口。
确保你的VirtualCenter安装路径里面没有包含 逗号(,) 或者 点(.)
确认Network service用户组对你准备安装vCenter Server 4.0路径的根目录拥有读权限。
确认安装vCenter Server 4.0的系统的计算机名称不超过15个字符。

vCenter Server 4.0的数据库需求:
vCenter Server 4.0的数据库不再支持SQL Server 2000了,所以你必须要先把数据库升级到SQL Server 2005或者2008。
虽然vCenter Server 4.0可以按照在64位系统上,但是请注意必须要使用32位的ODBC驱动来创建DSN

最后我想最起码得备份下VirtualCenter的数据吧。

虽然这些要求一般都很老套,但是往往有时候出现问题就是出在这个上面,所以建议还是对照着看一遍。

3.ESX4的相关需求
ESX4的要求相对来讲就要简单很多了基本在运行的esx3的机器都没什么问题,只是在ESX3升级到ESX4的时候有些需求要注意下
ESX3的本机VMFS卷或者是集群共享的VMFS卷至少有10GB的剩余空间
在HA环境下的ESX3升级到ESX4的时候确保有可用的剩余故障切换容量,不然就只能关VM了。
最后备份下ESX主机上的service console文件,.vmx文件,自定义脚本文件,host configuration和本机的VMFS卷。

4.Virtual Machines的相关需求
虚拟机要求更简单了,在升级VM hardware的时候确保VM没有suspend文件,另外我想VM的硬件里面都有个CDROM的吧,升级VMware Tools需要用到。
最后一步,非常重要,你要清楚的知道一旦对VM进行hardware upgrade就没办法回头了,所以至少在进行upgrade前对VM建一个快照,当然最好是把VM备份一下,不管你用何种方法。

5.升级第一步升级VMware vCenter Server
放入VMware vCenter Server光盘,或者把解压缩VMware vCenter Server安装包,运行autorun.exe在出来的vCenter Server 4.0安装界面上选择vCenter Server开始升级,基本上整个过程和安装并无太大区别,当中会有提示输入key,也可以留空安装完之后在vCenter Server里面输入,在升级数据库的时候注意下。最后安装完成会要求重启,重启后VMware vCenter Server的升级就完成了。
VMware vCenter Server升级完成后我们需要把老的
VMware Converter Enterprise Client 4.0.2
VMware Update Manager Client 1.0u3
在添加删除里面卸载掉,记得按照步骤来哦其它东西不要急的卸载还有用的。

卸载完成后打开原先的VMware Infrastructure Client没错就是老的,输入vc用户和密码后登陆,会弹出一个需求软件安装的对话框 有安装和下载2个选项,这里直接选择安装就行。然后就会自动安装vSphere Client,安装的时候注意勾选安装Install vSphere Host Update Utility 4.0,安装完成后双击桌面VMware vSphere Client,出来登陆框这里可以直接勾选Use windows session credentials这点比以前方便,点登陆后会有个证书警告的对话框这里可以勾选下面安装选项并点忽略。等会就进入了vCenter Server管理界面了。

接下来同样用VMware vCenter Server光盘安装Update Manager、Converter、Guided Consolidation,这里也基本没有什么难度照着安装界面说明来就行。
安装完成后进入vCenter Server在plugins菜单里下载安装vCenter Server的Update Manager、Converter插件。

到这里第一步升级VMware vCenter Server就算完成了。

6.升级第二步升级VMware ESX
ESX的升级有3种方法Update Manager、Host Update Utility或者用光盘安装
Update Manager方式:
进入vCenter Server选择HOME-Hosts and cluster
随便选择一台esx主机在Update Manager选单中选择PATCH方式的Baselines右键选择Detach Baseline把老的更新的基准删除,在选择Detach Baseline会有一个Hosts and cluster选择框,可以全选这样就能一步删除所有的Update Manager中的基准了。
再进入HOME-Update Manager,在上部选择upgrade Baseline,新建一个基准,注意在新建的时候下面确认选择的是host upgrade类型,下一步选择ESX upgrade iso,browse选择下载好的esx4的iso文件,再下一步如果有个证书警告的对话框勾选下面安装选项并点忽略,接下来会有一个上传过程,等待结束后继续下一部选择COS VMDK location 这里如果ESX本地VMDK有10GB剩余空间的话就选第一个,如果本机VMDK空间不足就选择第二项让系统自动选择或者第三项自己制定个共享的VMDK,后面反复下一步知道finish。这样一个host upgrade的Baseline就建好了。
回到HOME-Hosts and cluster选中要升级的esx进入Update Manager选单,attach刚刚建立好的Baseline,添加完成后scan选择upgrades对主机进行一次扫描,扫描完成后会有提示需要upgrade,选择下面的remediate,进入修复界面按照提示下一步当中也会有个COS VMDK location 的选择参照上面的说明选择继续下一步只到完成,这时候就会有修复任务在对esx进行升级了。经过一个漫长的等待期间esx还会进行重启,所有会有断开的警告,这都属正常,到最后升级完成esx就恢复正常状态了,如果有大批量的机器需要升级可以把Baseline附加到整个cluster,这样扫描和修复就是批量化了。

Host Update Utility方式:
可能在某些安装环境下比如服务器有多个ip,修改过端口啊,还有计算机名称和dns name不一样啊都会导致Update Manager出现各种问题(可以搜索下我以前写过的2篇关于Update Manager故障的博文),导致无法正常Update Manager,那么我们就要使用Host Update Utility来进行升级了。
在开始菜单-程序-vmware里选择vSphere Host Update Utility 4.0进入Host Update Utility
Host Update Utility的方式升级相对Update Manager要简单许多,适合esx机器数量较少的环境,在进入Host Update Utility后会有个选择下载patch的对话框,这里选择no,因为我们是upgrade不是打补丁。
首先要在vSphere Server里面把你需要升级的esx进入维护模式并且从cluster里面断开。
如果列表里面没有你的esx可以通过上方的add host添加,选择需要更新的esx主机点击下方的upgrade host进入下一步,选择esx4的iso,继续下一步一直到console os setting 也就是COS 设置,按照前面的规则选择一个合适的VMDK卷下方的disk size选择10GB,总得留点余地。然后一直下一步直到finish,开始升级。升级完成后再在vSphere Server的cluster重新连接升级完成的esx。

至于光盘安装的升级方式这里就不说了,基本和安装也没太多区别,不过也记得先进入维护模式并且从cluster里面断开后在升级。

升级第二步升级VMware ESX到这里就结束了。

7.升级第三步升级VM的VMtools和Virtual Hardware
vCenter Server和esx都升级完了,可能你已经迫不及待的想体验vSphere的新功能了吧,对于新建VM来讲确实你已经可以开始体验了,但是别忘了我们还有一堆老的VM等着升级才能发挥vSphere的功能。
这里在啰嗦一句,别头脑一热把备份VM忘了。

升级VM的VMtools
升级VM的VMtools也是通过Update Manager来进行的,和esx升级不同的是,vSphere Server已经有内建的Baseline了只需要附加到VM就可以具体过程就不多说了参考上面esx upgrade的Update Manager部分,一共要attach2个Baseline,VMware Tools Upgrade to Match Host和VMware Hardware Upgrade to Match Host。然后进行scan和remediate进行升级VMware Tools。

升级Virtual Hardware
升级Virtual Hardware要注意几点,1.必须删除全部快照,2.必须关闭VM,注意是关闭,不是挂起。在关闭VM后VM菜单下面才会出现Upgrade Virtual Hardware,点击后完成更新。这里在提醒下别忘了备份VM,否则后果自负。Virtual Hardware
升级完成后会发现vm概览页面VM version会变成7。

第三步升级VM的VMtools和Virtual Hardware到这就结束了。

8.第四步license
前面说过vSphere的license和VI3有着本质区别,vSphere是以key的方式的。在vSphere Server的HOME-Licensing,这里是整个vSphere Server的license管理中心,可以添加各种license。前面也提到过vSphere Server是兼容VI3的license server的,正常升级的话你应该在这个页面里面看见有license server,可以在administrator菜单里的vSphere Server settings里面修改license server地址,以用于vSphere Server 管理ESX3的主机。
vSphere 的license可以通过HOME-Licensing右上方的 Manage vSphere licenses进行添加并且分配给esx主机和vSphere Server。

第四步license基本就是这样了。

到这里整个升级流程基本上就介绍完了,虽然只是纯理论,但是我已经尽可能的接近实际操作的方式去描述了,下面我会我们的测试系统进行升级,来验证下本文的内容,到时候有问题直接在这里修改了,同时也希望大家发现问题的话帮忙纠正错误。
最后祝大家升级一次成功。 :mrgreen:

分类: vmware相关 标签: , , ,

windows下php5无法加载部分扩展dll问题解决

2009年5月26日 龙飞 没有评论

在windows下开启php的扩展是靠php.ini里面extension部分控制的,但是有部分扩展比如php_curl.dll、php_mcrypt.dll等开启后会在启动的时候提示PHP startup: Unable to load dynamic library的错误,这是因为这部分扩展还依赖一些dll库才能运行,而这些dll就在php的根目录下,所以按照install.txt文档里面的建议就是把 php所在的目录加到系统环境变量里面。当然加完后记得重启下机器,也可用修改完成后,进入DOS命令提示符,输入:set PATH=C: ,关闭DOS窗口来刷新下系统环境变量。

Update Manager扫描更新报错vmware.vcIntegrity.MetadataNotFound.fullFormat解决

2009年5月12日 龙飞 没有评论

这个问题和上次碰到的 patch metadata for xxxx missing 错误其实是一样解决的,上次是用的vc用的8080端口问题报错不太一样。

其实主要就2点
1.esx主机要开放Update Manager相关的防火墙规则,这个可以再命令行里面添加 也可以在vc里面esx主机的configuration里的security profile里面添加。

2.对于vc服务器有多个ip的情况要修改Update Manager目录下的vci-integrity.xml
找到
<hostconfig>
下面的
<patchdepoturl></patchdepoturl>
改为
<patchdepoturl>http://192.168.0.1/vci/hostupdates/hostupdate</patchdepoturl>
192.168.0.1为esx能访问的到的vc的ip,如果vc端口不是80的话就用192.168.0.1:端口

还有一个地方就是 <vpxdlocation>https://hostname:443/</vpxdlocation>
这个地方同样要改成esx能访问到的地址而不是默认的hostname,<vpxdlocation>https://192.168.0.1:443/</vpxdlocation>

这样再定义好Update Manager的基准baselines分配给esx就基本不会有什么问题了。

给windows 7的启动菜单添加启动项

2009年5月5日 龙飞 2 条评论

今天在给本本装了个Ubuntu 9.04,grub装在了Ubuntu的分区,本来是想在windows 7的启动菜单里加个启动项直接去加载Ubuntu分区的,结果进了windows 7 傻眼没找到boot.ini,上网查了查汗原来vista开始就用了新的启动模块bcd了,于是又翻了些资料,总结下:

启动菜单是可以添加的 但是必须用 bcdedit.exe来操作,运行方法,开始菜单输入cmd 右键以管理员身份运行。

然后就能输入bcdedit 来查看目前的bcd信息,如果出错,基本是没有以管理员身份运行cmd。

bcdedit /export “d:\bcd\bcd backup”

操作前先备份下bcd

添加一个启动菜单的命令是:

bcdedit /create /d “Ubuntu 9.04″ /application bootsector

正确的话会返回一句类似 “The entry {848f522b-3090-11de-8858-8443ad028695} was successfully created.”

bcdedit /set {848f522b-3090-11de-8858-8443ad028695} device partition=\Device\HarddiskVolume4

我的Ubuntu是装在第四个分区的所以这里设置的是\Device\HarddiskVolume4,根据实际情况修改

bcdedit /displayorder {848f522b-3090-11de-8858-8443ad028695} /addlast

把刚设置好的启动项加入启动菜单,放在最后。

这里只是演示下如何加菜单,如果要启动Ubuntu的话还需要吧bootsector的内容导出来,这就比较麻烦了,这里顺便推荐个工具EasyBCD  可以很方面的直接添加linux到启动菜单,不过要注意的是安装Ubuntu的时候要把grub安装到所在分区而不是硬盘mbr

分类: windows相关 标签:

如何关闭IIS6的HTTPERR日志

2009年4月29日 龙飞 1 条评论

默认情况下,2003服务器会把所有IIS访问错误的记录写入 C:\WINDOWS\system32\LogFiles\HTTPERR 下的 log 文件中,如果访问量比较大,可能一段时间后日志文件可能会占满C盘空间,导致服务器死机。同时因为要写入所有的IIS访问记录,如果访问量较大会大大增加服务器CPU占用率

关闭HTTPERR的方法

运行里输入 regedit 进入注册表编辑器
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters]

在右边 点鼠标右键 新建dword值 EnableErrorLogging 重新启动服务器就可以了

“EnableErrorLogging”=dword:00000000

重起后,2003不再写入HTTPERR日志文件,可以看到服务器CPU占用明显下降!

分类: windows相关 标签: ,

linux下实现UDP端口映射

2009年4月24日 龙飞 没有评论

一、实际问题
snmp监听端口默认为UPD 161,当监控服务器无法直接访问时,就需要用到端口映射来解决!
同样问题还有dns服务器的UPD 53端口。

二、使用nc来映射UPD端口
假设被监控服务器的IP为192.168.1.1;用于端口映射的主机为某个公网IP如59.1.1.1;需要映射的端口为UDP 161转发端口设为1161(自定义建议1024以上端口)
在端口映射服务器上操作,要安装nc,一般系统都会安装;
【注:nc存在安全漏洞,一定要设定防火墙】

首先使用mkfifo建立管道文件
#mkfifo /tmp/snmpfifo
通过nc建立端口映射 -l为监听模式 -u为UDP -p为本地端口;将内网监控161端口映射到本地的1161端口上;
#nc -l -u -p 1161 < /tmp/snmpfifo | nc -u 192.168.1.1 161 > /tmp/snmpfifo
查看netstat 1161是否监听
#netstat -nlp |grep :1161
udp     0      0 0.0.0.0:1161       0.0.0.0:*          31472/nc

在监控服务器上进行测试是否能采集到数据:

#snmpwalk -c public -v2c 59.1.1.1:1161 if
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
IF-MIB::ifIndex.4 = INTEGER: 4
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
….

设定成功;这里存在一个问题就是nc监听的端口每次一连接就会挂起,采取一个比较笨的办法就是写个restart.sh脚本放在crontab中每分钟执行一次;
产生该问题的主要原因我在下面讲socat的时候会分析的;
针对snmp采集这样是没有问题,如果dns服务就不行啦!

三、采用nc升级版本的socat来实现UDP端口映射
软件包下载地址:http://www.dest-unreach.org/socat/download/
安装无非就是configure make make install
socat的主要特点就是在两个数据流之间建立通道;且支持众多协议和链接方式:ip, tcp, udp, ipv6, pipe,exec,system,open,proxy,openssl,socket等
这里不一一介绍啦!
有兴趣可以查看官方文档:http://www.dest-unreach.org/socat/doc/socat.html
我们说说如何使用socat建立UPD端口映射

#socat udp4-listen:11161,reuseaddr,fork UDP:[监控服务器IP]:161
udp4-listen:在本地建立的是一个udp ipv4协议的监听端口;
reuseaddr,绑定本地一个端口;
fork,设定多链接模式,即当一个链接被建立后,自动复制一个同样的端口再进行监听;

【注:nc就是因为缺少fork模式,所以每次监听只能处理一次连接】
socat是一个强大的软件,希望与有这方面需求的同仁一起学习这个好的工具!
ps:无论是nc方式还是socat方式,启动监听模式都是在前端占用一个shell,所以请在后台执行或者使用screen工具等等!

http://www.hiadmin.com/linux下实现udp端口映射/

分类: linux相关 标签: , ,

MySQL字符集设定总结

2009年4月24日 龙飞 没有评论

MySQL(4.1以后版本) 服务器中有六个关键位置使用了字符集的概念,他们是:client 、connection、database、results、server 、system。MySQL有两个字符集概念:一个就是字符集本身,一个是字符集校验规则。字符集影响数据在传输和存储过程中的处理方式,而字符集校验则影响ORDER BY和GROUP BY这些排序方式。
1.和存储有关的
服务器字符集 (@@character_set_server)
库字符集 (@@character_set_database)
表字符集
字段字符集
character_set_server: 服务器安装时指定的默认字符集设定。
character_set_database: 数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。
character_system: 数据库系统使用的字符集设定。
在创建一个表的时候,每个字段只要不是binary,都会有一个字符集。如果不指定,那么在SHOW CREATE TABLE的时候,它是不会显示出来的。
建表时候,字段字符集的选取方式如下:
* if 字段指定的字符集
* else if 表指定的字符集
* else if @@character_set_database
* else @@character_set_server (如果没有设定,这个值为latin1)
2.和传输有关的
@@character_set_connection
@@character_set_results
@@character_set_client
character_set_connection: 连接数据库的字符集设置类型,如果php没有指明连接数据库使用的字符集类型就按照服务器端默认的字符设置
character_set_results: 数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集
character_set_client: 客户端使用的字符集,相当于网页中的字符集设置
3.字符集的校对规则
字符集的校对规则设定分别由上面的character_set_connection, character_set_database, character_set_server决定
collation_connection: 连接字符集的校对规则
collation_database: 默认数据库使用的校对规则。当默认数据库改变时服务器则设置该变量。如果没有默认数据库,变量的值同collation_server
collation_server: 服务器的默认校对规则
以上内容中character_set_client, character_set_connection, character_set_results 受客户端默认字符集影响,其中php编译mysql模块时的默认字符集同样也受到它链接的mysql动态库影响,从而影响到php的character_set_connection, character_set_client设定。当默认字符集不是utf8时,设置my.cnf
[mysqld]
default-character-set=utf8
default-collation=utf8_general_ci
default-character-set只能改变对存储层(server,database,table,column,system)的设定,对于客户端和服务器端的通讯层没有任何影响。
mysql> SHOW VARIABLES LIKE ‘character_set_%’;
+————————–+—————————————————————————+
| Variable_name | Value |
+————————–+—————————————————————————+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8
解决字符集通讯设置不匹配的方法:
(修改默认的character_set_client,character_set_connection,character_set_result)
1. 重新编译mysql和php,mysql加入编译参数 –default-character-set=utf8
2. PHP程序在查询数据库之前,执行mysql_query(”set names utf8;”);
3.修改my.cnf,在[mysqld]中加入init-connect=”set names utf8” (对于超级用户连接该选项无效)
4. 启动mysqld 加入参数 –skip-character-set-client-handshake 忽略客户端字符集

http://www.hiadmin.com/mysql字符集设定总结/

分类: mysql相关 标签:

linux 和unix下SAR命令的用法

2009年4月22日 龙飞 没有评论

dmesg可以直接查看cpu的主频,要查看CPU、内存的使用情况可以使用sar!

sar 命令行的常用格式:
sar [options] [-A] [-o file] t [n]

在命令行中,n 和t 两个参数组合起来定义采样间隔和次数,t为采样间隔,是必须有
的参数,n为采样次数,是可选的,默认值是1,-o file表示将命令结果以二进制格式
存放在文件中,file 在此处不是关键字,是文件名。options 为命令行选项,sar命令
的选项很多,下面只列出常用选项:

-A:所有报告的总和。
-u:CPU利用率
-v:进程、I节点、文件和锁表状态。
-d:硬盘使用报告。
-r:没有使用的内存页面和硬盘块。
-g:串口I/O的情况。
-b:缓冲区使用情况。
-a:文件读写情况。
-c:系统调用情况。
-R:进程的活动情况。
-y:终端设备活动情况。
-w:系统交换活动。

下面将举例说明。

例一:使用命令行 sar -u t n

例如,每60秒采样一次,连续采样5次,观察CPU 的使用情况,并将采样结果以二进制
形式存入当前目录下的文件zhou中,需键入如下命令:

# sar -u -o zhou 60 5

屏幕显示:

SCO_SV   scosysv 3.2v5.0.5 i80386   10/01/2001
14:43:50   %usr   %sys  %wio    %idle(-u)
14:44:50   0     1    4      94
14:45:50   0     2    4      93
14:46:50   0     2    2      96
14:47:50   0     2    5      93
14:48:50   0     2    2      96
Average    0     2    4      94

在显示内容包括:

%usr:CPU处在用户模式下的时间百分比。
%sys:CPU处在系统模式下的时间百分比。
%wio:CPU等待输入输出完成时间的百分比。
%idle:CPU空闲时间百分比。

在所有的显示中,我们应主要注意%wio和%idle,%wio的值过高,表示硬盘存在I/O瓶颈,
%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,
此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表
明系统中最需要解决的资源是CPU。

如果要查看二进制文件zhou中的内容,则需键入如下sar命令:

# sar -u -f zhou

可见,sar命令即可以实时采样,又可以对以往的采样结果进行查询。

例二:使用命行sar -v t n

例如,每30秒采样一次,连续采样5次,观察核心表的状态,需键入如下命令:

# sar -v 30 5

屏幕显示:
SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001
10:33:23 proc-sz ov inod-sz ov file-sz ov lock-sz   (-v)
10:33:53 305/ 321  0 1337/2764  0 1561/1706 0 40/ 128
10:34:23 308/ 321  0 1340/2764  0 1587/1706 0 37/ 128
10:34:53 305/ 321  0 1332/2764  0 1565/1706 0 36/ 128
10:35:23 308/ 321  0 1338/2764  0 1592/1706 0 37/ 128
10:35:53 308/ 321  0 1335/2764  0 1591/1706 0 37/ 128

显示内容包括:

proc-sz:目前核心中正在使用或分配的进程表的表项数,由核心参数MAX-PROC控制。

inod-sz:目前核心中正在使用或分配的i节点表的表项数,由核心参数
MAX-INODE控制。

file-sz: 目前核心中正在使用或分配的文件表的表项数,由核心参数MAX-FILE控
制。

ov:溢出出现的次数。

Lock-sz:目前核心中正在使用或分配的记录加锁的表项数,由核心参数MAX-FLCKRE
控制。

显示格式为

实际使用表项/可以使用的表项数

显示内容表示,核心使用完全正常,三个表没有出现溢出现象,核心参数不需调整,如
果出现溢出时,要调整相应的核心参数,将对应的表项数加大。

例三:使用命行sar -d t n

例如,每30秒采样一次,连续采样5次,报告设备使用情况,需键入如下命令:

# sar -d 30 5

屏幕显示:

SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001
11:06:43 device %busy   avque   r+w/s  blks/s  avwait avserv (-d)
11:07:13 wd-0   1.47   2.75   4.67   14.73   5.50 3.14
11:07:43 wd-0   0.43   18.77   3.07   8.66   25.11 1.41
11:08:13 wd-0   0.77   2.78   2.77   7.26   4.94 2.77
11:08:43 wd-0   1.10   11.18   4.10   11.26   27.32 2.68
11:09:13 wd-0   1.97   21.78   5.86   34.06   69.66 3.35
Average wd-0   1.15   12.11   4.09   15.19   31.12 2.80

显示内容包括:

device: sar命令正在监视的块设备的名字。
%busy: 设备忙时,传送请求所占时间的百分比。
avque: 队列站满时,未完成请求数量的平均值。
r+w/s: 每秒传送到设备或从设备传出的数据量。
blks/s: 每秒传送的块数,每块512字节。
avwait: 队列占满时传送请求等待队列空闲的平均时间。
avserv: 完成传送请求所需平均时间(毫秒)。

在显示的内容中,wd-0是硬盘的名字,%busy的值比较小,说明用于处理传送请求的有
效时间太少,文件系统效率不高,一般来讲,%busy值高些,avque值低些,文件系统
的效率比较高,如果%busy和avque值相对比较高,说明硬盘传输速度太慢,需调整。

例四:使用命行sar -b t n

例如,每30秒采样一次,连续采样5次,报告缓冲区的使用情况,需键入如下命令:

# sar -b 30 5

屏幕显示:

SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001
14:54:59 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s (-b)
14:55:29 0  147  100  5  21  78   0   0
14:55:59 0  186  100  5  25  79   0   0
14:56:29 4  232   98  8  58  86   0   0
14:56:59 0  125  100  5  23  76   0   0
14:57:29 0   89  100  4  12  66   0   0
Average  1  156   99  5  28  80   0   0

显示内容包括:

bread/s: 每秒从硬盘读入系统缓冲区buffer的物理块数。
lread/s: 平均每秒从系统buffer读出的逻辑块数。
%rcache: 在buffer cache中进行逻辑读的百分比。
bwrit/s: 平均每秒从系统buffer向磁盘所写的物理块数。
lwrit/s: 平均每秒写到系统buffer逻辑块数。
%wcache: 在buffer cache中进行逻辑读的百分比。
pread/s: 平均每秒请求物理读的次数。
pwrit/s: 平均每秒请求物理写的次数。

在显示的内容中,最重要的是%cache和%wcache两列,它们的值体现着buffer的使用效
率,%rcache的值小于90或者%wcache的值低于65,应适当增加系统buffer的数量,buffer
数量由核心参数NBUF控制,使%rcache达到90左右,%wcache达到80左右。但buffer参数
值的多少影响I/O效率,增加buffer,应在较大内存的情况下,否则系统效率反而得不到
提高。

例五:使用命行sar -g t n

例如,每30秒采样一次,连续采样5次,报告串口I/O的操作情况,需键入如下命令:

# sar -g 30 5

屏幕显示:

SCO_SV scosysv 3.2v5.0.5 i80386  11/22/2001
17:07:03  ovsiohw/s  ovsiodma/s  ovclist/s (-g)
17:07:33   0.00   0.00   0.00
17:08:03   0.00   0.00   0.00
17:08:33   0.00   0.00   0.00
17:09:03   0.00   0.00   0.00
17:09:33   0.00   0.00   0.00
Average    0.00   0.00   0.00

显示内容包括:

ovsiohw/s:每秒在串口I/O硬件出现的溢出。

ovsiodma/s:每秒在串口I/O的直接输入输出通道高速缓存出现的溢出。

ovclist/s :每秒字符队列出现的溢出。

在显示的内容中,每一列的值都是零,表明在采样时间内,系统中没有发生串口I/O溢
出现象。

sar命令的用法很多,有时判断一个问题,需要几个sar命令结合起来使用,比如,怀疑
CPU存在瓶颈,可用sar -u 和sar -q来看,怀疑I/O存在瓶颈,可用sar -b、sar -u和sar-d来看。
——————————————————————————–
Sar
-A 所有的报告总和
-a 文件读,写报告
-B 报告附加的buffer cache使用情况
-b buffer cache使用情况
-c 系统调用使用报告
-d 硬盘使用报告
-g 有关串口I/O情况
-h 关于buffer使用统计数字
-m IPC消息和信号灯活动
-n 命名cache
-p 调页活动
-q 运行队列和交换队列的平均长度
-R 报告进程的活动
-r 没有使用的内存页面和硬盘块
-u CPU利用率
-v 进程,i节点,文件和锁表状态
-w 系统交换活动
-y TTY设备活动

-a 报告文件读,写报告
</> sar –a 5 5
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/07/2002
11:45:40 iget/s namei/s dirbk/s (-a)
11:45:45 6 2 2
11:45:50 91 20 28
11:45:55 159 20 18
11:46:00 157 21 19
11:46:05 177 30 35
Average 118 18 20

iget/s 每秒由i节点项定位的文件数量
namei/s 每秒文件系统路径查询的数量
dirbk/s 每秒所读目录块的数量

*这些值越大,表明核心花在存取用户文件上的时间越多,它反映着一些程序和应用文件系统产生的负荷。一般地,如果iget/s与namei/s的比值大于5,并且namei/s的值大于30,则说明文件系统是低效的。这时需要检查文件系统的自由空间,看看是否自由空间过少。

-b 报告缓冲区(buffer cache)的使用情况
</> sar -b 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/07/2002
13:51:28 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s (-b)
13:51:30 382 1380 72 131 273 52 0 0
13:51:32 378 516 27 6 22 72 0 0
13:51:34 172 323 47 39 57 32 0 0
Average 310 739 58 58 117 50 0 0

bread/s 平均每秒从硬盘(或其它块设备)读入系统buffer的物理块数
lread/s 平均每秒从系统buffer读出的逻辑块数
%rcache 在buffer cache中进行逻辑读的百分比(即100% – bread/lreads)
bwrit/s 平均每秒从系统buffer向磁盘(或其它块设备)所写的物理块数
lwrit/s 平均每秒写到系统buffer的逻辑块数
%wcache 在buffer cache中进行逻辑写的百分比(即100% – bwrit/lwrit).
pread/sgu 平均每秒请求进行物理读的次数
pwrit/s 平均每秒请求进行物理写的次数

*所显示的内容反映了目前与系统buffer有关的读,写活。在所报告的数字中,最重要的是%rcache和%wcache(统称为cache命中率)两列,它们具体体现着系统buffer的效率。衡量cache效率的标准是它的命中率值的大小。
*如果%rcache的值小于90或者%wcache的值低于65,可能就需要增加系统buffer的数量。如果在系统的应用中,系统的I/O活动十分频繁,并且在内存容量配置比较大时,可以增加buffer cache,使%rcache达到95左右,%wcache达到80左右。
*系统buffer cache中,buffer的数量由核心参数NBUF控制。它是一个要调的参数。系统中buffer数量的多少是影响系统I/O效率的瓶颈。要增加系统buffer数量,则要求应该有较大的内存配置。否则一味增加buffer数量,势必减少用户进程在内存中的运行空间,这同样会导致系统效率下降。

-c 报告系统调用使用情况
</ > sar -c 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/07/2002
17:02:42 scall/s sread/s swrit/s fork/s exec/s rchar/s wchar/s (-c)
17:02:44 2262 169 141 0.00 0.00 131250 22159
17:02:46 1416 61 38 0.00 0.00 437279 6464
17:02:48 1825 43 25 0.00 0.00 109397 42331
Average 1834 91 68 0.00 0.00 225975 23651

scall/s 每秒使用系统调用的总数。一般地,当4~6个用户在系统上工作时,每秒大约30个左右。
sread/s 每秒进行读操作的系统调用数量。
swrit/s 每秒进行写操作的系统调用数量。
fork/s 每秒fork系统调用次数。当4~6个用户在系统上工作时,每秒大约0.5秒左右。
exec/s 每秒exec系统调用次数。
rchar/s 每秒由读操作的系统调用传送的字符(以字节为单位)。
wchar/s 每秒由写操作的系统调用传送的字符(以字节为单位)。
*如果scall/s持续地大于300,则表明正在系统中运行的可能是效率很低的应用程序。在比较
典型的情况下,进行读操作的系统调用加上进行写操作的系统调用之和,约是scall的一半左右。

-d 报告硬盘使用情况
</ > sar -d 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/07/2002
17:27:49 device %busy avque r+w/s blks/s avwait avserv (-d)
17:27:51 ida-0 6.93 1.00 13.86 259.41 0.00 5.00
ida-1 0.99 1.00 17.33 290.10 0.00 0.57
17:27:53 ida-0 75.50 1.00 54.00 157.00 0.00 13.98
ida-1 9.50 1.00 12.00 75.00 0.00 7.92
17:27:55 ida-0 7.46 1.00 46.77 213.93 0.00 1.60
ida-1 17.41 1.00 57.71 494.53 0.00 3.02
Average ida-0 29.85 1.00 38.14 210.28 0.00 7.83
ida-1 9.29 1.00 29.02 286.90 0.00 3.20

device 这是sar命令正在监视的块设备的名字。
%busy 设备忙时,运行传送请求所占用的时间。这个值以百分比表示。
avque 在指定的时间周期内,没有完成的请求数量的平均值。仅在队列被占满时取这个值。
r+w/s 每秒传送到设备或者从设备传送出的数据量。
blks/s 每秒传送的块数。每块512个字节。
avwait 传送请求等待队列空闲的平均时间(以毫秒为单位)。仅在队列被占满时取这个值。
avserv 完成传送请求所需平均时间(以毫秒为单位)
*ida-0和ida-1是硬盘的设备名字。在显示的内容中,如果%busy的值比较小,说明用于处理
传送请求的有效时间太少,文件系统的效率不高。要使文件系统的效率得到优化,应使%busy的数值相对高一些,而avque的值应该低一些。

-g 报告有关串口I/O情况
</ > sar -g 3 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/13/2002
11:10:09 ovsiohw/s ovsiodma/s ovclist/s (-g)
11:10:12 0.00 0.00 0.00
11:10:15 0.00 0.00 0.00
11:10:18 0.00 0.00 0.00
Average 0.00 0.00 0.00

ovsiohw/s 每秒在串囗I/O硬件出现的溢出。
ovsiodma/s 每秒在串囗I/O的直接输入,输出信道高速缓存出现的溢出。
ovclist/s 每秒字符队列出现的溢出。

-m 报告进程间的通信活动(IPC消息和信号灯活动)情况
</ > sar -m 4 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/13/2002
13:24:28 msg/s sema/s (-m)
13:24:32 2.24 9.95
13:24:36 2.24 21.70
13:24:40 2.00 36.66
Average 2.16 22.76

msg/s 每秒消息操作的次数(包括发送消息的接收信息)。
sema/s 每秒信号灯操作次数。
*信号灯和消息作为进程间通信的工具,如果在系统中运行的应用过程中没有使用它们,那么由sar命令报告的msg 和sema的值都将等于0.00。如果使用了这些工具,并且其中或者msg/s大于100,或者sema/s大于100,则表明这样的应用程序效率比较低。原因是在这样的应用程序中,大量的时间花费在进程之间的沟通上,而对保证进程本身有效的运行时间必然产生不良的影响。

-n 报告命名缓冲区活动情况
</ > sar -n 4 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/13/2002
13:37:31 c_hits cmisses (hit %) (-n)
13:37:35 1246 71 (94%)
13:37:39 1853 81 (95%)
13:37:43 969 56 (94%)
Average 1356 69 (95%)

c_hits cache命中的数量。
cmisses cache未命中的数量。
(hit %) 命中数量/(命中数理+未命中数量)。
*不难理解,(hit %)值越大越好,如果它低于90%,则应该调整相应的核心参数。

-p 报告分页活动
</ > sar -p 5 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/13/2002
13:45:26 vflt/s pflt/s pgfil/s rclm/s (-p)
13:45:31 36.25 50.20 0.00 0.00
13:45:36 32.14 58.48 0.00 0.00
13:45:41 79.80 58.40 0.00 0.00
Average 49.37 55.69 0.00 0.00

vflt/s 每秒进行页面故障地址转换的数量(由于有效的页面当前不在内存中)。
pflt/s 每秒来自由于保护错误出现的页面故障数量(由于对页面的非法存,取引起的页面故障)。
pgfil/s 每秒通过”页—入”满足vflt/s的数量。
rclm/s 每秒由系统恢复的有效页面的数量。有效页面被增加到自由页面队列上。
*如果vflt/s的值高于100,可能预示着对于页面系统来说,应用程序的效率不高,也可能分页参数需要调整,或者内存配置不太合适。

-q 报告进程队列(运行队列和交换队列的平均长度)情况
</ > sar -q 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/13/2002
14:25:50 runq-sz %runocc swpq-sz %swpocc (-q)
14:25:52 4.0 50
14:25:54 9.0 100
14:25:56 9.0 100
Average 7.3 100

runq-sz 准备运行的进程运行队列。
%runocc 运行队列被占用的时间(百分比)
swpq-sz 要被换出的进程交换队列。
%swpocc 交换队列被占用的时间(百分比)。
*如果%runocc大于90,并且runq-sz的值大于2,则表明CPU的负载较重。其直接后果,可能使系统的响应速度降低。如果%swpocc大于20,表明交换活动频繁,将严重导致系统效率下降。解决的办法是加大内存或减少缓存区数量,从而减少交换及页—入,页—出活动。

-r 报告内存及交换区使用情况(没有使用的内存页面和硬盘块)
</> sar -r 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/14/2002
10:14:19 freemem freeswp availrmem availsmem (-r)
10:14:22 279729 6673824 93160 1106876
10:14:24 279663 6673824 93160 1106876
10:14:26 279661 6673824 93160 1106873
Average 279684 6673824 93160 1106875

freemem 用户进程可以使用的内存页面数,4KB为一个页面。
freeswp 用于进程交换可以使用的硬盘盘块,512B为一个盘块。

-u CPU利用率
</> sar -u 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/14/2002
10:27:23 %usr %sys %wio %idle (-u)
10:27:25 2 3 8 88
10:27:27 3 3 5 89
10:27:29 0 0 0 100
Average 2 2 4 92
.
%usr cpu处在用户模式下时间(百分比)
%sys cpu处在系统模式下时间(百分比)
%wio cpu等待输入,输出完成(时间百分比)
%idle cpu空闲时间(百分比)
*在显示的内容中,%usr和 %sys这两个值一般情况下对系统无特别影响,%wio的值不能太高,如果%wio的值过高,则CPU花在等待输入,输出上的时间太多,这意味着硬盘存在I/O瓶颈。如果%idle的值比较高,但系统响应并不快,那么这有可能是CPU花时间等待分配内存引起的。%idle的值可以较深入帮助人们了解系统的性能,在这种情况上,%idle的值处于40~100之间,一旦它持续低于30,则表明进程竟争的主要资源不是内存而是CPU。
*在有大量用户运行的系统中,为了减少CPU的压力,应该使用智能多串卡,而不是非智能多串卡。智能多串卡可以承担CPU的某些负担。
*此外,如果系统中有大型的作业运行,应该把它们合理调度,错开高峰,当系统相对空闲时再运行。

-v 报告系统表的内容(进程,i节点,文件和锁表状态)
</> sar -v 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/14/2002
10:56:46 proc-sz ov inod-sz ov file-sz ov lock-sz (-v)
10:56:48 449/ 500 0 994/4147 0 1313/2048 0 5/ 128
10:56:50 450/ 500 0 994/4147 0 1314/2048 0 5/ 128
10:56:52 450/ 500 0 994/4147 0 1314/2048 0 5/ 128

proc-sz 目前在核心中正在使用或分配的进程表的表项数
inod-sz 目前在核心中正在使用或分配的i节点表的表项数
file-sz 目前在核心中正在使用或分配的文件表的表项数
ov 溢出出现的次数
lock-sz 目前在核心中正在使用或分配的记录加锁的表项数
*除ov外,均涉及到unix的核心参数,它们分别受核心参数NPROC,NIMODE,NFILE和FLOCKREC的控制。
*显示格式为:
实际使用表项/整个表可以使用的表项数
比如,proc-sz一列所显示的四个数字中,分母的100是系统中整个进程表的长度(可建立100个表项),分子上的24,26和25分别是采样的那一段时间所使用的进程表项。inod-sz,file-sz和lock-sz三列数字的意义也相同。
三列ov的值分别对应进程表,i节点表和文件表,表明目前这三个表都没有出现溢出现象,当出现溢出时,需要调整相应的核心参数,将对应表加大。

-w 系统交换活动
</> sar -w 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/14/2002
11:22:05 swpin/s bswin/s swpot/s bswots pswch/s (-w)
11:22:07 0.00 0.0 0.00 0.0 330
11:22:09 0.00 0.0 0.00 0.0 892
11:22:11 0.00 0.0 0.00 0.0 1053
Average 0.00 0.0 0.00 0.0 757

swpin/s 每秒从硬盘交换区传送进入内存的次数。
bswin/s 每秒为换入而传送的块数。
swpot/s 每秒从内存传送到硬盘交换区的次数。
bswots 每秒为换出而传送的块数。
pswch/s 每秒进程交换的数量。
*swpin/s,bswin/s,swpot/s和bswots描述的是与硬盘交换区相关的交换活动。交换关系到系统的效率。交换区在硬盘上对硬盘的读,写操作比内存读,写慢得多,因此,为了提高系统效率就应该设法减少交换。通常的作法就是加大内存,使交换区中进行的交换活动为零,或接近为零。如果swpot/s的值大于1,预示可能需要增加内存或减少缓冲区(减少缓冲区能够释放一部分自由内存空间)。

-y 报告终端的I/O活动(TTY设备活动)情况
</> sar -y 2 3
SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/14/2002
11:38:03 rawch/s canch/s outch/s rcvin/s xmtin/s mdmin/s (-y)
11:38:05 5 0 951 0 1 0
11:38:07 10 0 996 0 0 0
11:38:09 4 0 2264 0 0 0
Average 6 0 1404 0 1 0

rawch/s 每秒输入的字符数(原始队列)
canch/s 每秒由正则队列(canonical queue)处理的输入字符数。进行正则处理过程中,可以识别出一些有特殊意义的字符。比如,<Del>(中断字符),<ctrl>(退出符),<Bksp>(退格键)等。因此,canch/s中的计数不包括这些有特殊意义的字符。
outch/s 每秒输出的字符数。
rcvin/s 每秒接收的硬件中断次数。
xmtin/s 每秒发出的硬件中断次数。
mdmin/s 每秒modem中断次数。
*应该特别说明,sar命令可以对任意终端活动进行统计,所谓任意终端,是指任意tty设备。它们可以是串行终端,主控台,伪终端等等。
*在这几个量中,modem中断次数mdmin/s应该接近0。其它没有特殊要求,但如果每发送一个字符,中断的数量就动态地增加,这表明终端线出了差错,可能是接触不好。

这个包在各大发行版中都有,如果您试一下有sar这个命令就证明已经有了。如果没有的,可以下载安装上就OK了

一、简要介绍:

sysstat这个工具,可以说是linux &Unix 以及Freebsd最常用的工具。它的主要用途就是观察服务负载,比如CPU和内存的占用率、网络的使用率以及磁盘写入和读取速度等。

sar
iostat
sa1
sa2
sadf
mpstat
sadc
sysstat

这几个命令中,有的是服务,有的是查看结果的命令。也有的是即时服务器CPU,内存以及网络的使用率,比如先要打开sa1 sa2或者sysstat 才能使用sar sadf sadc, 还要即时服务器的CPU,内存,网络使用率的命令,比如:mpstat iostat
二、安装:

首先您到 [url]http://perso.wanadoo.fr/sebastien.godard/[/url] 下载最新的版本,最好是源码包,比如我下载的是sysstat-5.1.1.tar.gz

安装方法比较简单:

1.解包:

#tar zxvf sysstat-5.1.1.tar.gz

2.安装:

#cd sysstat-5.1.1
#make config 这步可以省略,因为我在安装的过程 中,发现在有些发行版中出错,如果不用这个命令,可以直接安装到其默认的/usr/local/lib目录中
make config这个命令就是用来配置sysstat安装的,比如安装路径,log存放等,如下:

代码:
Installation directory: [/usr/local]
sadc directory: [/usr/local/lib/sa]
System activity directory: [/var/log/sa]
Clean system activity directory? [n]
Enable National Language Support (NLS)? [y]
Linux SMP race in serial driver workaround? [n]
sa2 uses daily data file of previous day? [n]
Number of daily data files to keep: [7]
Group for manual pages: [man]
Set crontab to start sar automatically? [n]

#make 注:这步是必须的,如果您不用第一步,这步也是必要的。

#make install

这样就安装好了。

三、使用:

对于这个工具,如何使用呢??如果您想看即时 服务器的CPU,内存,网络使用率的命令,比如:mpstat iostat ,您可以简单的用下面的命令,如果更复杂一点,您可以用man来查看所有命令的用法。

比如:
[beinan@S11 beinan]$ iostat
Linux 2.4.22-2f (S11) 2004年10月30日

avg-cpu: %user %nice %system %iowait %idle
8.64 0.00 0.95 0.00 90.41
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
dev3-0 2.97 55.28 38.84 213314 149856

[beinan@S11 beinan]$ mpstat
Linux 2.4.22-2f (S11) 2004年10月30日

03时13分56秒 CPU %user %nice %sys %iowait %irq %soft %idle intr/s
03时13分56秒 all 8.56 0.00 0.94 0.00 0.00 0.00 90.50 84.32

比如观察磁盘的读写速度:

[beinan@S11 beinan]$ iostat -p
Linux 2.4.22-2f (S11) 2004年10月30日

avg-cpu: %user %nice %system %iowait %idle
33.54 0.00 4.95 0.86 60.65

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
hda 26.26 186.57 481.17 16117015 41564960
hda1 3.29 1.33 26.01 115138 2246456
hda2 19.86 26.49 149.65 2288449 12927104
hda3 40.16 158.57 305.51 13697580 26391400
hda5 0.00 0.00 0.00 8 0

如果是想让服务器自动运行,并且想每个小时都有一个数据反馈,我们可以用cron 来让执行sa1 sa2,这样就有一份日志文件存在/var/log/sa/目录中。我们到时运行sar就能知道所有过去时间每个小时运行情况:

可以写一个命令到一个文件中。。。把这个文件设置为755的执行权限,放在/etc/cron.hourly目录中。

[root@S11 root]# cd /etc/cron.hourly/ 进入目录
[root@S11 cron.hourly]# touch sa1ho 创建文件,这个文件名可以自己来命名
[root@S11 cron.hourly]# chmod 755 sa1ho
然后在这个文件中写入下面的一行

/usr/local/lib/sa/sa1&

这样每一个小时,就有日志文件写入/var/log/sa/目录中了,当然还有一个/usr/local/lib/sa/sa2的命令,也可以写一个文件到 在/etc/cron.weekly/目录中,sa2是做什么用的呢?自己先看看帮助文件,当然也可以写入/etc/cron.hourly/ ,这样就每小时一次。

分类: linux相关 标签: ,

MySQL 中 Join 的基本实现原理

2009年4月22日 龙飞 1 条评论

在 MySQL 中,只有一种 Join 算法,就是大名鼎鼎的 Nested Loop Join,他没有其他很多数据库所提供的 Hash Join,也没有 Sort Merge Join。顾名思义,Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与 Join,则再通过前两个表的 Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复。

还是通过示例和图解来说明吧,后面将通过我个人数据库测试环境中的一个 example(自行设计,非MySQL 自己提供) 数据库中的三个表的 Join 查询来进行示例。

注意:由于这里有些内容需要在MySQL 5.1.18之后的版本中才会体现出来,所以本测试的MySQL 版本为5.1.26

表结构:

sky@localhost : example 11:09:32> show create table user_groupG
***************************
1. row ***************************
Table: user_group
Create Table: CREATE TABLE `user_group` (
`user_id` int(11) NOT NULL,
`group_id` int(11) NOT NULL,
`user_type` int(11) NOT NULL,
`gmt_create` datetime NOT NULL,
`gmt_modified` datetime NOT NULL,
`status` varchar(16) NOT NULL,
KEY `idx_user_group_uid` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

sky@localhost : example 11:10:32> show create table group_messageG
***************************
1. row ***************************
Table: group_message
Create Table: CREATE TABLE `group_message` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`gmt_create` datetime NOT NULL,
`gmt_modified` datetime NOT NULL,
`group_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`author` varchar(32) NOT NULL,
`subject` varchar(128) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_group_message_author_subject` (`author`,`subject`(16)),
KEY `idx_group_message_author` (`author`),
KEY `idx_group_message_gid_uid` (`group_id`,`user_id`)
) ENGINE=MyISAM AUTO_INCREMENT=97 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

sky@localhost : example 11:10:43> show create table group_message_contentG
***************************
1. row ***************************
Table: group_message_content
Create Table: CREATE TABLE `group_message_content` (
`group_msg_id` int(11) NOT NULL,
`content` text NOT NULL,
KEY `group_message_content_msg_id` (`group_msg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

使用Query如下:

select m.subject msg_subject, c.content msg_content
from user_group g,group_message m,group_message_content c
where g.user_id = 1
and m.group_id = g.group_id
and c.group_msg_id = m.id

看看我们的 Query 的执行计划:

sky@localhost : example 11:17:04> explain select m.subject msg_subject, c.content msg_content
->
from user_group g,group_message m,group_message_content c
->
where g.user_id = 1
->
and m.group_id = g.group_id
->
and c.group_msg_id = m.idG
***************************
1. row ***************************
id: 1
select_type: SIMPLE
table: g
type: ref
possible_keys: user_group_gid_ind,user_group_uid_ind,user_group_gid_uid_ind
key: user_group_uid_ind
key_len: 4
ref: const
rows: 2
Extra:
***************************
2. row ***************************
id: 1
select_type: SIMPLE
table: m
type: ref
possible_keys: PRIMARY,idx_group_message_gid_uid
key: idx_group_message_gid_uid
key_len: 4
ref: example.g.group_id
rows: 3
Extra:
***************************
3. row ***************************
id: 1
select_type: SIMPLE
table: c
type: ref
possible_keys: idx_group_message_content_msg_id
key: idx_group_message_content_msg_id
key_len: 4
ref: example.m.id
rows: 2
Extra:

我们可以看出,MySQL Query Optimizer 选择了 user_group 作为驱动表,首先利用我们传入的条件 user_id 通过 该表上面的索引 user_group_uid_ind 来进行 const 条件的索引 ref 查找,然后以 user_group 表中过滤出来的结果集的 group_id 字段作为查询条件,对 group_message 循环查询,然后再通过 user_group 和 group_message 两个表的结果集中的  group_message 的 id 作为条件 与 group_message_content 的 group_msg_id 比较进行循环查询,才得到最终的结果。没啥特别的,后一个引用前一个的结果集作为条件,实现过程可以通过下图表示:

下面的我们调整一下 group_message_content 去掉上面的 idx_group_message_content_msg_id 这个索引,然后再看看会是什么效果:

sky@localhost : example 11:25:36> drop index idx_group_message_content_msg_id ongroup_message_content;
Query OK, 96 rows affected (0.11 sec)

sky@localhost : example 10:21:06> explain
->
select m.subject msg_subject, c.content msg_content
->
from user_group g,group_message m,group_message_content c
->
where g.user_id = 1
->
and m.group_id = g.group_id
->
and c.group_msg_id = m.idG
***************************
1. row ***************************
id: 1
select_type: SIMPLE
table: g
type: ref
possible_keys: idx_user_group_uid
key: idx_user_group_uid
key_len: 4
ref: const
rows: 2
Extra:
***************************
2. row ***************************
id: 1
select_type: SIMPLE
table: m
type: ref
possible_keys: PRIMARY,idx_group_message_gid_uid
key: idx_group_message_gid_uid
key_len: 4
ref: example.g.group_id
rows: 3
Extra:
***************************
3. row ***************************
id: 1
select_type: SIMPLE
table: c
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 96
Extra: Using where; Using join buffer

我们看到不仅仅 group_message_content 表的访问从 ref 变成了 ALL,此外,在最后一行的 Extra信息从没有任何内容变成为  Using where; Using join buffer,也就是说,对于从 ref 变成 ALL 很容易理解,没有可以使用的索引的索引了嘛,当然得进行全表扫描了,Using where 也是因为变成全表扫描之后,我们需要取得的 content 字段只能通过对表中的数据进行 where 过滤才能取得,但是后面出现的 Using join buffer 是一个啥呢?

我们知道,MySQL 中有一个供我们设置的参数 join_buffer_size ,这里实际上就是使用到了通过该参数所设置的 Buffer 区域。那为啥之前的执行计划中没有用到呢?

实际上,Join Buffer 只有当我们的 Join 类型为 ALL(如示例中),index,rang 或者是 index_merge 的时候 才能够使用,所以,在我们去掉 group_message_content 表的 group_msg_id 字段的索引之前,由于 Join 是 ref 类型的,所以我们的执行计划中并没有看到有使用 Join Buffer。

当我们使用了 Join Buffer 之后,我们可以通过下面的这张图片来表示 Join 完成过程:
nested_join_with_buffer

作者:Sky.Jian

链接:http://www.jianzhaoyang.com/database/mysql_join_buffer_nested_loop_implement

分类: mysql相关 标签: ,