常用命令[]
cp |
Copy |
mv |
移動、重命名 |
yum |
yum nstall xxx |
rm |
rm –rf xx |
mkdir |
建目錄 |
rpm |
rpm –ivh xxx.rpm |
tail |
tail –f rr.log |
find |
find /usr/local -name xxx |
tar |
①tar xzvf xxxx.ta.gz |
rz |
上傳文件 |
sz |
下載 |
②cd xxx ./configure ./configure –prefix=/user/local[指定目錄]加參數 |
|
wc |
行、字、字節數 |
chmod |
chmod 777 –R xxx |
||
head |
head -3 sqlq.log |
|
|
||
ps |
ps –ef|more |
kill |
ps -ef | grep xx kill -9 [xxPID] |
③make && make install |
|
grep |
查找 |
|
|||
|
|
|
|
|
|
vi /etc/profile 最下面配置環境變量 |
|
|
2.影響性能的因素
因素1:cpu
因素factor |
指標metrics |
描述 |
備注 |
監測monitor |
|
CPU /proc/cpuinfo |
Load average |
等待執行的隊列中進程數+ 等待uninterruptable task完成的進程數 |
cpu負荷的趨勢. |
top |
|
Procs |
Run queue |
Runnable,ready to run(running / waiting for runtime)的進程數【可執行未執行的】 |
|
vmstat(r) |
|
Blocked |
uninterruptible wait(通常因IO)進程數 |
|
vmstat(b) |
||
System |
Context Switch |
線程的切換 |
減少程序無關的請求 |
vmstat(cs) |
|
Interrupts |
正在處理的中斷數: (hi)Hard interrupts、(si)soft interrupts |
|
top (cpu--hi、si) vmstat(in) |
||
cpu 利用率 |
User time |
處理非內核操作的時間 |
User%+sys% 好(<70%)一般(85%)糟糕(>=90) |
top vmstat iostat(avg-cpu)
|
|
System time |
處理內核操作的時間 |
||||
Waiting |
等待io完成的時間 |
|
|||
Idle time |
空閑時間 |
<5%-à充分利用 |
|||
Nice time |
處理re-nicing進程的時間 |
|
iostat(nice%) |
||
CPU影響大是最誤區,因為服務器的cpu一般是overconfigured。除非一些cpu密集使用的應用。 |
|||||
簡單解決方法 |
|||||
如果有多余的進程,可以ps –ef來停掉 CPU-intensive的進程,可以renice調整優先級 SMP-based使用taskset來將進程綁定cpu,避免來回切換 最新驅動和防火牆,減少對cpu的負載。 |
案例:CPU高的分析
1、us% or sy%高,使用命令top;
1.1.1 、us%高,看看是哪個任務/線程的占用高,使用top排序或者ps –ef查看
1.1.2、了解線程的作用,可使用strace 查看該進程的執行情況,分析是否有異常,是否需要調整。
1.2.1、sy%高,查看memory、io方面性能,使用vmstat、iostat命令。
1.2.2、memory方面的問題,考慮是否要調整這方面的參數或增加內存
1.2.2、io方面的問題,考慮是否要增加快速的磁盤驅動等解決方案。
1.2.3、也要查看進程的占用情況,用strace查看該進程的執行情況,分析是否有異常,是否需要調整。
因素2:內存
因素factor |
指標metrics |
描述 |
監測monitor |
備注 |
Memory /proc/meminfo |
Free memory |
Linux把未使用的內存作為buffer和cache。 |
top(mem-free) vmstat(free) |
|
Swap usage (si、so) |
使用的swap space。 physical memory用完后, 將最近使用過,暫不使用的memory pages 從physical memory寫到swap space。 表示剩余的可支配物理內存嚴重不足,需要通過與磁盤交換內容來保持系統穩定性;磁盤處理速度要遠小於內存,值越大性能瓶頸越明顯。 |
top(swap-used) vmstat(swpd) |
si 、so[à0好]: swap頻繁程度,長期很大,表示內存不夠or未有效利用內存 |
|
Buffer |
不同步設備、優先級不同的設備間緩存 |
top(mem-buffers) vmstat(buffer) |
|
|
Cache |
Cpu和主內存間高速文件緩存(cpu剛用過或循環使用的部分數據,cpu再用時就從cache調用) |
top(swap-cached) vmstat(cache) |
|
|
Slabs |
內核使用 |
vmstat –m |
|
|
Active\inactive memory |
活躍和不活躍的內存大小 |
vmstat -a |
|
|
瓶頸表現 |
free↓,swpd↑(si、so↑),bi 、bo↑,in↑,cs↑、b↑,wa↑ |
|||
測試期間,保持內存充足,可用內存>20% |
||||
簡單解決方法 |
||||
調整swap space,使用大頁面,大塊內存,共享內存; 調整頁面的大小; 改進對活動和非活動內存的處理; 調整換頁率page-out rate.; 限制服務器上每個用戶的可用資源; 停掉不需要的服務; 增加內存; |
因素3:I/O
因素 |
指標metrics |
描述 |
監測monitor |
|
I/O
|
等待 |
iowait |
等待io操作的時間 好(<20%)一般(=35%)糟糕(>=50%) |
iostat(avg-cpu:iowait) |
Average wait |
實際的io操作時間svctm + +在io隊列中等待時間 Svctm越接近awai越好 |
iostat –x (await) |
||
Average queue length |
Io請求隊列長度 |
iostat –x (avgqu-sz) |
||
請求數 |
Tps |
每秒處理的io操作數量。 |
iostat (tps) |
|
r/s、w/s |
每秒讀、寫請求數 |
iostat –x(r/s 、w/s) 或用rrqm/s 、wrqm/s(合並請求)考察 |
||
數據量 |
bi、bo |
讀、寫磁盤的塊數(block/s) |
vmstat(bi、bo) iostat(Blk_read、BLk_wrtn) 或用kb、mb做單位考察總讀寫量 |
|
KB r/s、KB w/s |
每秒對設備讀、寫數量Kb/s |
iostat (Kb_read/s、Kb_wrtn/s) 或用MB、塊、扇區做單位考察每秒讀寫量 |
||
瓶頸表現 |
(%util↑)設備繁忙、(await>>svctm)IO請求等待時間長,(avgqu-sz↑)等待隊列長度大。 |
|||
簡單解決方法 |
||||
少量的大容量磁盤、減少邏輯盤; 序列式且控制器的帶寬壓力大,添加更快的磁盤控制器;隨機式,增加磁盤驅動; Raid環境中,添加磁盤驅動; 增加RAM; |
因素4:Network
因素factor |
指標metrics |
描述 |
備注 |
監測monitor |
Network
|
收、發送的包數 |
|
|
|
收、發送的字節數 |
|
|
||
每秒沖突數 |
|
|
||
掉包的數量 |
|
|
||
Overruns |
|
|
||
Errors |
|
|
||
查看網絡流量 |
watch –n 1 “/sbin/ifconfig eth0|grep bytes”
|
外網: tx 發送[transport] rx 接收[receive] 內網相反。 |
||
date;ifconfig eth0 顯示當前日期下網卡網絡情況
|
||||
簡單解決方法 |
||||
調整網絡配置; 換網卡、加更快的網卡。 修改ipv4 tcp的內核參數; |
案例:大量TIME_WAIT連接
使用netstat –ae|grep “TIME_WAIT”|wc –l #查看多少個TIME_WAIT
[往往是因為程序代碼中未關閉mysql連接netstat -ae |grep mysql]。
解決方法:
調整內核參數:vi /etc/sysctl.conf
加入以下內容, 修改后,執行/sbin/sysctl –p 讓參數生效:
net.ipv4.tcp_syncookies=1
#開啟SYN Cookies。當SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認0(關閉)
net.ipv4.tcp_tw_reuse=1 #開啟重用。允許將TIME-WAIT socket重用於新的TCP連接,默認0(關閉)
net.ipv4.tcp_tw_recycle=1 #開始TCP連接中TIME-WAIT socket的快遞回收,默認0(關閉)
net.ipv4.tcp_fin_timeout=30 #修改系統默認的TIME_OUT時間
net.ipv4.tcp_keepalive_probes=5 #減少超時前的探測次數
net.ipv4.tcp_keepalive_intvl=20 #探測消息發送頻率
net.ipv4.tcp_keepalive_time=1200
#表示當keepalive啟用時,TCP發送的keepalive消息的頻率。缺省值為2小時,修改為2分鍾。
net.ipv4.ip_local_port_range=1024 65000
#用於向外連接的端口范圍。缺省情況很小為32768到61000,改為1024到65000
net.ipv4.tcp_max_syn_backlog=8192
#SYN隊列的長度,默認為1024,加大了隊列的長度為8192,可容納更多等待連接的網絡連接數
net.ipv4.tcp_max_tw_buckets=5000
#同時保持TIME_WAIT的最大數量,如超出,立刻清除TIME_WAIT、打印警告信息。默認180000,改為5000
3.監測性能指標的工具
Use the monitoring tools to to narrow down the bottleneck to the subsystem level.
工具1:top命令
top |
動態\實時的運行情況 當前活躍的進程信息 參數:top –u root(看這user是這root的)、top –p 123(看pid123的) |
||||
匯總信息 |
運行時間 Load average |
當前時間\運行時間\用戶數 平均負載(1min、5min、15min),后兩個時間段是重要的 |
|||
task和cpu |
Task:running; sleeping; stopped; zombie cpu間隔內情況,多核(按1): us、sy、id、wa、ni、hi(硬件中斷)、si(軟件中斷)、st(stolen) |
||||
Memory Usage |
物理內存和虛擬內存情況 |
||||
輸入行 |
k:kill r:renice(調整任務優先級) o:列的順序 f:顯示哪些列 |
u:篩選user i:忽略空閑和僵死進程 M:駐留內存大小(res)排序 P: %cpu排序 |
T: time排序 q:quit A: S: |
||
列和Task |
PID PPID S |
進程id |
|||
父進程id |
|||||
進程狀態: D=不可中斷的睡眠狀態、R=運行、 S=睡眠 T=跟蹤/停止、Z=僵屍進程 |
|||||
COMMAND |
命令名/命令行 |
||||
UID USER RUSER GROUP |
進程所有者的用戶id |
||||
進程所有者的用戶名 |
|||||
Real user name |
|||||
進程所有者的組名 |
|||||
PR NI |
優先級 |
||||
nice值。負值表示高優先級,正值表示低優先級 |
|||||
%CPU TIME |
上次更新到現在的CPU時間占用百分比 |
||||
進程使用的CPU時間總計,秒 |
|||||
%MEM VIRT SWAP RES CODE DATA |
進程使用的物理內存百分比 |
||||
進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES |
|||||
進程使用的虛擬內存中,SWAP SPACE大小, kb。 |
|||||
進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA |
|||||
可執行代碼占用的物理內存大小, kb |
|||||
可執行代碼以外的部分(數據段+棧)占用的物理內存大小, kb |
|||||
nFLT |
頁面錯誤次數 |
||||
nDRT |
最后一次寫入到現在,被修改過的頁面數。 |
||||
工具2:vmstat命令
vmstat |
vmstat [options] [delay [count]] 第一個條是自開機到現在的平均值(不指定delay,僅顯示此條) 下面的是delay時間間隔的抽樣 ,procs、memory都是瞬時的情況 參數:vmstat –t(時間戳) |
|
Procs |
r |
Runnable,ready to run(running / waiting for runtime)的進程數 |
B |
uninterruptible wait(通常因為io)的進程數 |
|
Memory |
swpd |
使用的虛擬內存大小KB |
free |
空閑內存大小 |
|
Buff |
被用作Buffer的內存大小 |
|
Cache |
被用作cache的內存大小 |
|
Swap |
si、so |
磁盤分頁到內存memory Swapped in 大小(kb/s) |
內存分頁到磁盤memory Swapped out 大小。si so 趨於0,內存狀態較好。 |
||
Io |
bi、bo |
讀、寫磁盤的塊數(block/s) |
System |
in、cs |
每秒中斷數 每秒上下文切換數 |
Cpu |
us、sy、id、wa |
Cpu時間% |
St |
Time stolen from a virtual machine |
工具3:iostat命令
iostat |
從開機到當前執行時刻的統計信息 參數:iostat –x(詳細信息) |
|
||
CPU 多核:平均 |
%user |
Cpu處理非內核% |
|
|
%nice |
用戶級別with a nice priority cpu使用% |
|
||
%sys |
內核使用cpu% |
|
||
%idle |
空閑時間的% |
|
||
Device |
Device |
塊設備名稱 |
|
|
請求數 |
tps |
對應設備的每秒Io請求數 |
|
|
rrqm/s wrqm/s |
每秒該設備的讀、寫請求被合並數 |
|
||
r/s、w/s |
每秒讀rio、寫wio請求數 |
|
||
數據量 |
Blk_read/s Blk_wrtn/s Blk_read BLk_wrtn |
每秒讀、寫數據量(塊數)。/讀、寫的總量。 Blk_read、BLk_wrtn從開機到現在 讀寫的總塊數
塊的大小:dumpe2fs –h /dev/sda1 |grep –F “Block size” |
|
|
Kb_read/s Kb_wrtn/s Kb_read Kb_wrtn |
每秒讀、寫數據量(KB)/讀、寫的總量。----- iostat –k rMB/s、wMB/s (MB) ----- iostat –m |
|
||
rsec/s Wsec/s |
每秒讀、寫數據量(扇區) |
|
||
Avgrq-sz |
每個io請求的平均扇區數。 |
|
||
等待 |
awaitr_await w_await |
平均每次設備i/o等待和操作的時間。 |
||
svctm |
平均每次設備io操作時間(接近await表示等待越少) |
|||
Avgqu-sz |
平均io隊列長度。 |
|
||
%util |
設備繁忙程度(80%很忙) |
|
工具4:strace命令
strace |
被進程調用的系統調用的執行情況,定位異常的具體位置。 先使用top命令定位異常的進程 |
|
strace –T –p [pid] 顯示每次調用所耗時間 |
|
|
strace –c –p [pid] strace –c find/etc –name xxx (strace –c <command>)
統計每一系統調用的內核執行時間、次數和出錯次數等 |
|
|
|
|
|
工具5:netstat命令
netstat |
各種網絡相關信息,如網絡連接,路由表,Interface Statistics\masquerade連接 |
|
Active Internet connections |
Recv-Q Send-Q |
接收但未做處理的字節數。 發送但還未被確認的字節數。 一般應是0。大於0表示正在隊列中堆積數據 |
Active UNIX domain sockets |
Proto |
Proto顯示連接使用的協議(tcp udp ) |
RefCnt |
RefCnt表示連接到本套接口上的進程號 |
|
Types |
Types顯示套接口的類型 |
|
State |
socket狀態: LISTEN(服務端socket正在監聽)ESTABLISHED(已建立連接) SYN_SENT(發送連接請求后等待匹配)SYN_RECV(收到連接請求等連接請求的確認) FIN_WAIT1(發送中斷請求后,等中斷確認),FIN_WAIT2(收到ack后,稍后中斷) TIME_WAIT(收到fin、 ack,socket等關閉對剩余數據包的處理后再回復中斷確認) CLOSE_WAIT(收到fin后回復了ack,由本地確認是否關閉連接) CLOSING(都中斷了,但還有數據傳輸) LAST_ACK(被動關閉在發送了fin后,再等待對方的ack,收到ack后關閉連接) CLOSED(沒有任何連接狀態)unknown(未知) |
|
Path |
Path表示連接到套接口的其它進程使用的路徑名。 |
|
-a (all)顯示所有listen和non-listen,默認不顯示listen -t (tcp)僅顯示tcp相關選項;-u (udp)僅顯示udp相關選項 -n 拒絕顯示別名,能顯示數字的全部轉化成數字。
-p 顯示建立連接的pid和程序名 [root@centos0 xampp]# netstat -anp|grep mysql -e 顯示擴展信息,例如uid等netstat -ae |grep mysql -s 按各個協議進行統計 -c 不停的刷新continuous listing。
提示:LISTEN和LISTENING的狀態只有用-a或者-l才能看到
|
ps命令
ps |
詳細的進程信息 Pstree\ \pmap |
|
ps –elFL |
F |
Process flag |
S |
進程狀態: S=sleeping、R=runnig、T=stopped ortraced、D=interuptable sleep,Z=zombie |
|
UID PID PPID |
||
LWP |
LWP[Light weight process,or thread]ID of the lwp being reported |
|
C |
Cpu利用率 |
|
NLWP |
Number of lwps(threads)in the process |
|
PRI |
Priority of theprocess |
|
NI |
Niceness level |
|
ADDR |
Process address space【不顯示的】 |
|
SZ |
Code+data+stack 總的memory大小(kb) |
|
WCHAN |
Sleeping的Kernel function名。- 進程為運行,*多線程 |
|
RSS |
駐留集大小、non-swapped物理內存使用大小 |
|
PSR |
Processor that process is currently assigned to. |
|
STIME |
本次開始的時間 |
|
TTY |
終端 |
|
TIME |
自動啟動占用的cpu時間 |
|
CMD |
開啟命令(有參數) |
|
Ps –A :顯示正在運行的所有進程 : |
工具6:Iptraf使用(待整理)
工具7:spotlight on linux使用(待整理)
各種命令
4.調優(還沒有熟悉)
注:一點一點的調,調了用同一方式來衡量性能改變情況
修改各項配置相關信息前,要備份。記錄每次修改,尤其是會影響其他方面的修改。
不要在生產環境調
調優完成后,繼續監測其它指標,直到達到性能目標
調優后再評估性能情況,和基准對比。
ulimit調整內核參數
ulimit –a #用來顯示當前的各種用戶進程限制。linux對每個用戶、系統限制了最大的進程數。
vi /etc/profile
ulimit –u 10000 #用戶的最大進程數
ulimit –n 4096 #每個進程可以打開的文件數
ulimit –d unlimited #數據段長度
ulimit –m unlimited #最大內存大小
ulimit –s unlimited #堆棧的大小
ulimit –t unlimited #cpu時間
ulimit –v unlimited#虛擬內存
limits.conf
解除linux系統的最大進程數和最大文件打開限制
vi /etc/security/limits.conf,添加以下內容,注意添加完成后重啟
*代表所有用戶,也可以指定用戶;noproc 代表最大的進程數;nofile 代表最大文件打開數
* soft noproc 11000
*hard noproc 11000
*soft nofile 8192
*hard nofile 20480
命令: show status like '%下面變量%';
Aborted_clients 由於客戶沒有正確關閉連接已經死掉,已經放棄的連接數量.
Aborted_connects 嘗試已經失敗的MySQL服務器的連接的次數.
Connections 試圖連接MySQL服務器的次數.
Created_tmp_tables 當執行語句時,已經被創造了的隱含臨時表的數量.
Delayed_insert_threads 正在使用的延遲插入處理器線程的數量.
Delayed_writes 用INSERT DELAYED寫入的行數.
Delayed_errors 用INSERT DELAYED寫入的發生某些錯誤(可能重復鍵值)的行數.
Flush_commands 執行FLUSH命令的次數.
Handler_delete 請求從一張表中刪除行的次數.
Handler_read_first 請求讀入表中第一行的次數.
Handler_read_key 請求數字基於鍵讀行.
Handler_read_next 請求讀入基於一個鍵的一行的次數.
Handler_read_rnd 請求讀入基於一個固定位置的一行的次數.
Handler_update 請求更新表中一行的次數.
Handler_write 請求向表中插入一行的次數.
Key_blocks_used 用於關鍵字緩存的塊的數量.
Key_read_requests 請求從緩存讀入一個鍵值的次數.
Key_reads 從磁盤物理讀入一個鍵值的次數.
Key_write_requests 請求將一個關鍵字塊寫入緩存次數.
Key_writes 將一個鍵值塊物理寫入磁盤的次數.
Max_used_connections 同時使用的連接的最大數目.
Not_flushed_key_blocks 在鍵緩存中已經改變但是還沒被清空到磁盤上的鍵塊.
Not_flushed_delayed_rows 在INSERT DELAY隊列中等待寫入的行的數量.
Open_tables 打開表的數量.
Open_files 打開文件的數量.
Open_streams 打開流的數量(主要用於日志記載)
Opened_tables 已經打開的表的數量.
Questions 發往服務器的查詢的數量.
Slow_queries 要花超過long_query_time時間的查詢數量.
Threads_connected 當前打開的連接的數量.
Threads_running 不在睡眠的線程數量.
Uptime 服務器工作了多少秒.