星期四, 3月 24, 2011

Linux 效能分析

iostat 
[root@hqu-mysql ~]# iostat -x 
Linux 2.6.9-89.0.15.ELsmp (hqu-mysql)   2009年11月25日 

avg-cpu:  %user   %nice    %sys %iowait   %idle 
                   7.95       0.00       5.96       1.24      84.85 

Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz await  svctm  %util 
ida/c0d0     0.03   7.54  6.29  7.11   94.87  117.22    47.44    58.61    15.84     1.09       81.67   4.51   6.04 
ida/c0d0p1   0.03   7.54  6.29  7.11   94.87  117.22    47.44    58.61    15.84     1.09       81.68   4.51   6.04 
ida/c0d0p2   0.00   0.00  0.00  0.00    0.00    0.00     0.00     0.00        45.66     0.00       12.72  10.03   0.00 
数据库应该是有硬盘io延迟问题的。 

结果详解: 
% user      显示了在用户级(应用程序)执行时产生的 CPU 使用率百分比。 
% sys       显示了在系统级(内核)执行时产生的 CPU 使用率百分比。 
% idle       显示了在 CPU 空闲并且系统没有未完成的磁盘 I/O 请求时的时间百分比。 
% iowait   显示了 CPU 空闲期间系统有未完成的磁盘 I/O 请求时的时间百分比。 

rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s 
wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s 
r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s 
w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s 
rsec/s: 每秒读扇区数。即 delta(rsect)/s 
wsec/s: 每秒写扇区数。即 delta(wsect)/s 
rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。 
wkB/s: 每秒写K字节数。是 wsect/s 的一半。 
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio) 
avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。 
await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio) 
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio) 
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒) 

简单分析: 
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。 

svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。 

队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。 

vmstat 
[root@sends ~]# vmstat -a 2 
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu---- 
r  b   swpd   free  inact active   si   so    bi    bo   in    cs us sy id wa 
2  0      0 589428 847744 2391492    0    0     1    21    3     6 23 13 64  0 
2  0      0 585972 848296 2394760    0    0     0    62 1076   754 21 33 46  0 
1  0      0 589108 848796 2390680    0    0     0     0 1077   702 22 33 46  0 
1  0      0 629604 825368 2374436    0    0     0    30 1024   685 20 32 47  0 
1  0      0 631012 825368 2372948    0    0     0    20 1029   682 21 33 46  0 


结果分析: 
Procs 
r:等待执行的任务数 
b:处在非中断睡眠状态的进程数 
展示了正在执行和等待CPU资源的任务个数。当这个值超过了CPU数目,就会出现CPU瓶颈了 

Memory 
swpd:正在使用的swap大小单位K
free:空闲的内存空间
buff:已使用的buff大小,对块设备的读写进行缓冲
cache:已使用的cache大小,文件系统的cache
inact: 
active: 

Swap 
si:交换内存使用,由磁盘调入内存 
so:交换内存使用,由内存调入磁盘 

IO 
bi:从块设备读入的数据总量(读磁盘) (KB/s) 
bo:写入到块设备的数据总理(写磁盘) (KB/s) 

System 
in:每秒产生的中断次数
cs:每秒产生的上下文切换次数 
上面这2个值越大,会看到由内核消耗的CPU时间会越多 

CPU 
us:用户进程消耗的CPU时间百分比 
us 的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超过50% 的使用,那么我们就该考虑优化程序算法或者进行加速了 
sy:内核进程消耗的CPU时间百分比 
sy 的值高时,说明系统内核消耗的CPU资源多,这并不是良性的表现,我们应该检查原因。 
id:空闲
wa:IO等待消耗的CPU时间百分比 
wa 的值高时,说明IO等待比较严重,这可能是由于磁盘大量作随机访问造成,也有可能是磁盘的带宽出现瓶颈(块操作)。




使用Linux性能分析工具
Linux在具有高穩定性、可靠性的同時,具有很好的可伸縮性和擴展性,
能夠針對不同的應用和硬件環境調整,優化出滿足當前應用需要的最佳性能。
因此企業在維護Linux系統、進行系統調優時,了解系統性能分析工具是至關重要的。

在Linux下有很多系統性能分析工具,
比較常見的有top、free、ps、time、timex、uptime等。
下文將介紹几個較為重要的性能分析工具vmstat、iostat和sar及其使用。

用vmstat監視內存使用情況
vmstat是Virtual Meomory Statistics(虛擬內存統計)的縮寫,可對操作系統的虛擬內存、進程、CPU活動進行監視。
它是對系統的整體情況進行統計,不足之處是無法對某個進程進行深入分析。

vmstat的語法如下:
vmstat [-V] [-n] [delay [count]]

其中,-V表示打印出版本信息;-n表示在周期性循環輸出時,輸出的頭部信息僅顯示一次;
delay是兩次輸出之間的延遲時間;count是指按照這個時間間隔統計的次數。
對于vmstat輸出各字段的含義,可運行man vmstat查看。



用iostat監視I/O子系統情況
iostat是I/O statistics(輸入/輸出統計)的縮寫,iostat工具將對系統的磁盤操作活動進行監視。
它的特點是匯報磁盤活動統計情況,同時也會匯報出 CPU使用情況。
同vmstat一樣,iostat也有一個弱點,就是它不能對某個進程進行深入分析,僅對系統的整體情況進行分析。

iostat的語法如下:
iostat [ -c | -d ] [ -k ] [ -t ] [ -V ] [ -x [ device ] ] [ interval [ count ] ]

其中,-c為匯報CPU的使用情況;-d為匯報磁盤的使用情況;-k表示每秒按kilobytes字節顯示數據;
-t為打印匯報的時間;-v表示打印出版本信息和用法;-x device指定要統計的設備名稱,默認為所有的設備;
interval指每次統計間隔的時間;count指按照這個時間間隔統計的次數。



使用sar進行綜合分析
sar是System Activity Reporter(系統活動情況報告)的縮寫。
顧名思義,sar工具將對系統當前的狀態進行取樣,然后通過計算數據和比例來表達系統的當前運行狀態。
它的特點是可以連續對系統取樣,獲得大量的取樣數據;取樣數據和分析的結果都可以存入文件,所需的負載很小。
sar是目前Linux上最為全面的系統性能分析工具之一,可以從14個大方面對系統的活動進行報告,
包括文件的讀寫情況、系統調用的使用情況、串口、CPU效率、內存使用狀況、進程活動及IPC有關的活動等,使用也是較為複雜。

sar的語法如下:

sar [-option] [-o file] t [n]
它的含義是每隔t秒取樣一次,共取樣n次。其中-o file表示取樣結果將以二進制形式存入文件file中。

sar option參數說明

選項 功能
-A 匯總所有的報告
-a 報告文件讀寫使用情況
-B 報告附加的緩存的使用情況
-b 報告緩存的使用情況
-c 報告系統調用的使用情況
-d 報告磁盤的使用情況
-g 報告串口的使用情況
-h 報告關于buffer使用的統計數據
-m 報告IPC消息隊列和信號量的使用情況
-n 報告命名cache的使用情況
-p 報告調頁活動的使用情況
-q 報告運行隊列和交換隊列的平均長度
-R 報告進程的活動情況
-r 報告沒有使用的內存頁面和硬盤塊
-u 報告CPU的利用率
-v 報告進程、i節點、文件和鎖表狀態
-w 報告系統交換活動狀況
-y 報告TTY設備活動狀況


另一種語法如下:

sar [-option] [-s time] [-e time] [-i sec] [-f file]

含義是表示從file文件中取出數據,如果沒有指定-f file,
則從標准數據文件/var/adm/sa/sadd取數據,其中dd表示當前天。
另外,-s time表示起始時間;-e time表示停止時間;
-i sec表示取樣的時間間隔,如果不指定則表示取文件中所有的數據。

一般它與-q和-u聯合使用,以便對每個CPU的使用情況進行分析,比如運行如下命令:
sar -q -u 5 1

由于sar命令太複雜,只有通過熟練使用才能了解每個選項的含義,
對于sar輸出中每個字段的含義運行man sar命令可以得到詳細的解釋。





參考資料:
http://saplingidea.javaeye.com/blog/526617
http://tw.myblog.yahoo.com/bullock0425/article?mid=-2&prev=534&l=a&fid=25

DHCP Snooping

參考資料:
在網段中,如果不小心打開了 "寬頻分享器" DHCP Server 功能。
通常這些 DHCP 服務預設都是打開的,而且都是 192.168.1.0/24 這個網段。所以這些怪怪的 IP 位址, 通常都是類似這樣 : 192.168.1.X。
整個網段, 通常會"部分取得正確, 部分取得錯誤".
Cisco 2950 以上的 Switch 支援 DHCP Snooping 功能,只要啟動這個功能,不管再有誰做這種事,也不會發生錯誤取得IP位址的問題
DHCP Snooping 的原理簡單的來說,Switch 會監看 DHCP 的活動,就是只允許指定的部分 Switch Port 放行 DHCP伺服器的回應封包,其他的一律不准。
所以只會取得指定 Server 回應的 DHCP 內容。
CISCO 交換機可攔截來自不信任埠口的 DHCP 要求,任何來自不信任埠口之 DHCP 封包將被丟棄。進入errdisable狀態。
在收到合法回應時,並可記錄已完成的 DHCP 資訊庫,內有 MAC位置 / IP位置 / 租用時間 等等資訊。
注意: 有一點很重要, 如果 DHCP Server 不是接在本 Switch 時, Uplink port 就必須要允許 DHCP Server 回應,不然整台 Switch 上的 PC 都會收不到動態的 IP位址資訊!
另外, 因為設定過程會影響 DHCP 運作, 建議最好是在離峰時間再啟動這個功能!
以下是一般的設定:
Global,啟動 DHCP Snooping,這行一定要。
 ip dhcp snooping
假設只對 VLAN 100 和 VLAN 200 作 DHCP 設限, 這行也一定要,可以是單一 vlan,也可以是一個 range x-x"
 ip dhcp snooping vlan 100 200
DHCP Server 埠,或是 Uplink,這邊是重點所在,不然會全部都收不到!
interface GigabitEthernet0/1
  ip dhcp trust
一般使用者埠,這是預設值,可以不用下,啟動 DHCP Snooping 後,預設所有埠口為不信任狀態。
 interface FastEthernet 0/1
  no ip dhcp trust
針對不信任埠口,可以限制 DHCP 封包流量速率。使用下列指令:
 ip dhcp snooping limit rate "流量,1-4294967294 / 封包"
倘若在不信任埠口偵測到 DHCP 要求,交換機可把本身 MAC / 交換埠識別字 加入到該封包的 選項82 之下。
使其可以順利的到達可信任的 DHCP 伺服器。此功能預設啟用。可以使用以下指令控制:
 [no] ip dhcp snooping information option
DHCP SNOOPING 檢查指令,如果後面加上 bining 字串,將可顯示所有已被監聽到且儲存在交換機裡的 DHCP 租用狀況。
show ip dhcp snooping [binding]

星期二, 3月 15, 2011

Linux DMA 關閉

當Linux 出現

Mar 15 05:52:23  kernel: ide-cd: cmd 0x3 timed out
Mar 15 05:52:23 qwfnhrep02 kernel: hda: irq timeout: status=0xd0 { Busy }
Mar 15 05:52:23 qwfnhrep02 kernel: hda: irq timeout: error=0x00
Mar 15 05:52:24 qwfnhrep02 kernel: hda: ATAPI reset complete

表示開啟DMA的功能,但是OS不支援
Linux 本身預設是開啟的
上面的訊息為hda光碟機有DMA功能OS不支援,但不影響server的運作
檢查系統中的DMA選項是否已被啓動
Linux中的hdparm命令是用來進行操控硬碟、光碟機之類設備的,
hdparm -i /dev/hda可以列出IDE可能支持的DMA模式,如:

DMA modes: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 *udma4

啓動DMA支援
方法1:
在lilo.conf中加入:idex=dma,其中x代表硬碟序號,其取值範圍0-3,
分别代表系統中的四個IDE硬碟設備。

方法2:
使用hdparm命令,hdparm -d1 /dev/hda 其中d1表示開啓DMA模式,
可以利用加到rc.local中以便每次啓動OS時能使用DMA模式傳輸資料。

關閉DMA
命令格式:
hdparm -d0 /dev/hda 

參考資料:

星期五, 3月 11, 2011

將messages log 裡的snmp log 切出來

messages log 被 大量的 snmp log Received SNMP packet(s) from UDP:佔滿
修改/etc/sysconfig/snmpd.options
新增OPTIONS="-Lf /dev/null -p /var/run/snmpd.pid"
然後重新restart snmpd


參考資料
http://space.itpub.net/35489/viewspace-673743
http://kaien.wikidot.com/linux:rhel-snmp-syslog
http://blog.mgcrazy.com/?p=59

星期二, 3月 08, 2011

sendmail : STARTTLS: read error=generic SSL error (0)

sendmail 出現下列訊息,並一直重覆出現 STARTTLS: read error=generic SSL error (0)


Mar  7 13:52:09 QWFNHMAIL01 sendmail[17353]: STARTTLS: write error=syscall error (-1)
Mar  7 13:52:09 QWFNHMAIL01 sendmail[17353]: STARTTLS: write error=generic SSL error (-1)
Mar  7 13:52:09 QWFNHMAIL01 sendmail[17353]: p275hbkf017322: SYSERR(root): putbody: write error: Input/output error
Mar  7 13:52:09 QWFNHMAIL01 sendmail[17353]: p275hbkf017322: to=<jn075@webmail.mlc.edu.tw>,<ylg785@webmail.mlc.edu.tw>, delay=00:08:32, xdelay=00:05:11, mail
er=esmtp, pri=960570, relay=nopam.mlc.edu.tw. [163.19.163.60], dsn=4.0.0, stat=I/O error
Mar  7 13:52:09 QWFNHMAIL01 sendmail[17353]: STARTTLS: read error=generic SSL error (0)
Mar  7 13:52:11 QWFNHMAIL01 sendmail[17353]: STARTTLS: read error=generic SSL error (0)


查看 /etc/mail/sendmail.cf  沒有打開TLS選項確一直出現
google一下有可能是sendmail 8.12.X的bug
大部份都說去改一個site.config.m4 的檔案,還要再compiler ,還是先不要這麼做...
查到一個方法是把出現STL那個訊息的process 砍掉
http://www.utahsysadmin.com/2007/02/09/starttls-read-errorgeneric-ssl-error-0/
原來這麼簡單...

[root@QWFNHMAIL01 log]# tail maillog
Mar  8 10:33:15 QWFNHMAIL01 sendmail[17353]: STARTTLS: read error=generic SSL error (0)
Mar  8 10:33:16 QWFNHMAIL01 last message repeated 54114 times
Mar  8 10:33:16 QWFNHMAIL01 sendmail[29009]: p282XDkx029009: Too many recipients
Mar  8 10:33:16 QWFNHMAIL01 sendmail[17353]: STARTTLS: read error=generic SSL error (0)
Mar  8 10:33:16 QWFNHMAIL01 last message repeated 11 times
Mar  8 10:33:16 QWFNHMAIL01 sendmail[29009]: p282XDkx029009: from=<tp6888@xuite.net>, size=0, class=0, nrcpts=50, proto=SMTP, daemon=MTA, relay=[10.117.10.81]
Mar  8 10:33:17 QWFNHMAIL01 sendmail[17353]: STARTTLS: read error=generic SSL error (0)
Mar  8 10:33:22 QWFNHMAIL01 last message repeated 221790 times
Mar  8 10:33:22 QWFNHMAIL01 sendmail[29010]: p282XMkw029010: [172.16.216.6] did not issue MAIL/EXPN/VRFY/ETRN during connection to MTA
Mar  8 10:33:22 QWFNHMAIL01 sendmail[17353]: STARTTLS: read error=generic SSL error (0)

[root@QWFNHMAIL01 log]# kill -9 17353
[root@QWFNHMAIL01 log]# ps -ef |grep sendmail
root      2814     1  0  2010 ?        00:00:00 [sendmail]
root     26302     1  0 Mar07 ?        00:00:03 [sendmail]
smmsp    26311     1  0 Mar07 ?        00:00:00 [sendmail]
root     28798     1  0 10:27 ?        00:00:00 [sendmail]
root     28980     1  0 10:31 ?        00:00:00 [sendmail]
root     28990     1  0 10:32 ?        00:00:00 [sendmail]
root     29008     1  0 10:33 ?        00:00:00 [sendmail]
root     29009 26302  0 10:33 ?        00:00:00 [sendmail]
root     29014 28578  0 10:33 pts/1    00:00:00 grep sendmail