寫在前面
基本操作
Linux關(guān)機,重啟
查看系統(tǒng),CPU信息
建立軟連接
rpm相關(guān)
sshkey
命令重命名
同步服務器時間
后臺運行命令
強制活動用戶退出
查看命令路徑
查看進程所有打開最大fd數(shù)
配置dns
nslookup,查看域名路由表
last, 最近登錄信息列表
設置固定ip
查看進程內(nèi)加載的環(huán)境變量
查看進程樹找到服務器進程
查看進程啟動路徑
添加用戶, 配置sudo權(quán)限
強制關(guān)閉進程名包含xxx的所有進程
vim操作
打開只讀文件,修改后需要保存時(不用切換用戶即可保存的方式)
查看磁盤, 文件目錄基本信息
wc命令
常用壓縮, 解壓縮命令
- 壓縮命令
- 解壓縮命令
變更文件所屬用戶, 用戶組
cp, scp, mkdir
比較兩個文件
日志輸出的字節(jié)數(shù),可以用作性能測試
查看, 去除特殊字符
處理因系統(tǒng)原因引起的文件中特殊字符的問題
tee, 重定向的同時輸出到屏幕
grep
awk
find檢索命令
查看什么進程使用了該端口
獲取本機ip地址
iptables
nc命令, tcp調(diào)試利器
tcpdump
跟蹤網(wǎng)絡路由路徑
ss
netstat
top
dmesg,查看系統(tǒng)日志
iostat,磁盤IO情況監(jiān)控
free,內(nèi)存使用情況
sar,查看網(wǎng)絡吞吐狀態(tài)
vmstat, 給定時間監(jiān)控CPU使用率, 內(nèi)存使用, 虛擬內(nèi)存交互, IO讀寫
寫在前面
雖然平時大部分工作都是和Java相關(guān)的開發(fā), 但是每天都會接觸Linux系統(tǒng), 尤其是使用了Mac之后, 每天都是工作在黑色背景的命令行環(huán)境中. 自己記憶力不好, 很多有用的Linux命令不能很好的記憶, 現(xiàn)在逐漸總結(jié)一下, 以便后續(xù)查看.
基本操作
Linux關(guān)機,重啟
# 關(guān)機
shutdown -h now
# 重啟
shutdown -r now
查看系統(tǒng),CPU信息
# 查看系統(tǒng)內(nèi)核信息
uname -a
# 查看系統(tǒng)內(nèi)核版本
cat /proc/version
# 查看當前用戶環(huán)境變量
env
cat /proc/cpuinfo
# 查看有幾個邏輯cpu, 包括cpu型號
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
# 查看有幾顆cpu,每顆分別是幾核
cat /proc/cpuinfo | grep physical | uniq -c
# 查看當前CPU運行在32bit還是64bit模式下, 如果是運行在32bit下也不代表CPU不支持64bit
getconf LONG_BIT
# 結(jié)果大于0, 說明支持64bit計算. lm指long mode, 支持lm則是64bit
cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l
建立軟連接
ln -s /usr/local/jdk1.8/ jdk
rpm相關(guān)
# 查看是否通過rpm安裝了該軟件
rpm -qa | grep 軟件名
sshkey
# 創(chuàng)建sshkey
ssh-keygen -t rsa -C your_email@example.com
#id_rsa.pub 的內(nèi)容拷貝到要控制的服務器的 home/username/.ssh/authorized_keys 中,如果沒有則新建(.ssh權(quán)限為700, authorized_keys權(quán)限為600)
命令重命名
# 在各個用戶的.bash_profile中添加重命名配置
alias ll='ls -alF'
同步服務器時間
sudo ntpdate -u ntp.api.bz
后臺運行命令
# 后臺運行,并且有nohup.out輸出
nohup xxx &
# 后臺運行, 不輸出任何日志
nohup xxx > /dev/null &
# 后臺運行, 并將錯誤信息做標準輸出到日志中
nohup xxx >out.log 2>&1 &
強制活動用戶退出
# 命令來完成強制活動用戶退出.其中TTY表示終端名稱
pkill -kill -t [TTY]
查看命令路徑
which <命令>
查看進程所有打開最大fd數(shù)
ulimit -n
配置dns
vim /etc/resolv.conf
nslookup,查看域名路由表
nslookup google.com
last, 最近登錄信息列表
# 最近登錄的5個賬號
last -n 5
設置固定ip
搜索公縱號:MarkerHub,關(guān)注回復[ vue ]獲取前后端入門教程氯材!
ifconfig em1 192.168.5.177 netmask 255.255.255.0
查看進程內(nèi)加載的環(huán)境變量
# 也可以去 cd /proc 目錄下, 查看進程內(nèi)存中加載的東西
ps eww -p XXXXX(進程號)
查看進程樹找到服務器進程
ps auwxf
查看進程啟動路徑
cd /proc/xxx(進程號)
ls -all
# cwd對應的是啟動路徑
添加用戶, 配置sudo權(quán)限
# 新增用戶
useradd 用戶名
passwd 用戶名
#增加sudo權(quán)限
vim /etc/sudoers
# 修改文件里面的
# root ALL=(ALL) ALL
# 用戶名 ALL=(ALL) ALL
強制關(guān)閉進程名包含xxx的所有進程
ps aux|grep xxx | grep -v grep | awk '{print $2}' | xargs kill -9
磁盤,文件,目錄相關(guān)操作
vim操作
#normal模式下 g表示全局, x表示查找的內(nèi)容, y表示替換后的內(nèi)容
:%s/x/y/g
#normal模式下
0 # 光標移到行首(數(shù)字0)
$ # 光標移至行尾
shift + g # 跳到文件最后
gg # 跳到文件頭
# 顯示行號
:set nu
# 去除行號
:set nonu
# 檢索
/xxx(檢索內(nèi)容) # 從頭檢索, 按n查找下一個
?xxx(檢索內(nèi)容) # 從尾部檢索
打開只讀文件,修改后需要保存時(不用切換用戶即可保存的方式)
# 在normal模式下
:w !sudo tee %
查看磁盤, 文件目錄基本信息
# 查看磁盤掛載情況
mount
# 查看磁盤分區(qū)信息
df
# 查看目錄及子目錄大小
du -H -h
# 查看當前目錄下各個文件, 文件夾占了多少空間, 不會遞歸
du -sh *
wc命令
# 查看文件里有多少行
wc -l filename
# 看文件里有多少個word
wc -w filename
# 文件里最長的那一行是多少個字
wc -L filename
# 統(tǒng)計字節(jié)數(shù)
wc -c
常用壓縮, 解壓縮命令
壓縮命令
tar czvf xxx.tar 壓縮目錄
zip -r xxx.zip 壓縮目錄
解壓縮命令
tar zxvf xxx.tar
# 解壓到指定文件夾
tar zxvf xxx.tar -C /xxx/yyy/
unzip xxx.zip
變更文件所屬用戶, 用戶組
chown eagleye.eagleye xxx.log
cp, scp, mkdir
#復制
cp xxx.log
# 復制并強制覆蓋同名文件
cp -f xxx.log
# 復制文件夾
cp -r xxx(源文件夾) yyy(目標文件夾)
# 遠程復制
scp -P ssh端口 username@10.10.10.101:/home/username/xxx /home/xxx
# 級聯(lián)創(chuàng)建目錄
mkdir -p /xxx/yyy/zzz
# 批量創(chuàng)建文件夾, 會在test,main下都創(chuàng)建java, resources文件夾
mkdir -p src/{test,main}/{java,resources}
比較兩個文件
diff -u 1.txt 2.txt
日志輸出的字節(jié)數(shù),可以用作性能測試
# 如果做性能測試, 可以每執(zhí)行一次, 往日志里面輸出 “.” , 這樣日志中的字節(jié)數(shù)就是實際的性能測試運行的次數(shù), 還可以看見實時速率.
tail -f xxx.log | pv -bt
查看, 去除特殊字符
# 查看特殊字符
cat -v xxx.sh
# 去除特殊字符
sed -i 's/^M//g’ env.sh 去除文件的特殊字符, 比如^M: 需要這樣輸入: ctrl+v+enter
處理因系統(tǒng)原因引起的文件中特殊字符的問題
# 可以轉(zhuǎn)換為該系統(tǒng)下的文件格式
cat file.sh > file.sh_bak
# 先將file.sh中文件內(nèi)容復制下來然后運行, 然后粘貼內(nèi)容, 最后ctrl + d 保存退出
cat > file1.sh
# 在vim中通過如下設置文件編碼和文件格式
:set fileencodings=utf-8 ,然后 w (存盤)一下即可轉(zhuǎn)化為 utf8 格式欧芽,
:set fileformat=unix
# 在mac下使用dos2unix進行文件格式化
find . -name "*.sh" | xargs dos2unix
tee, 重定向的同時輸出到屏幕
awk ‘{print $0}’ xxx.log | tee test.log
檢索相關(guān)
grep
# 反向匹配, 查找不包含xxx的內(nèi)容
grep -v xxx
# 排除所有空行
grep -v '^$'
# 返回結(jié)果 2,則說明第二行是空行
grep -n “^$” 111.txt
# 查詢以abc開頭的行
grep -n “^abc” 111.txt
# 同時列出該詞語出現(xiàn)在文章的第幾行
grep 'xxx' -n xxx.log
# 計算一下該字串出現(xiàn)的次數(shù)
grep 'xxx' -c xxx.log
# 比對的時候,不計較大小寫的不同
grep 'xxx' -i xxx.log
awk
# 以':' 為分隔符,如果第五域有user則輸出該行
awk -F ':' '{if ($5 ~ /user/) print $0}' /etc/passwd
# 統(tǒng)計單個文件中某個字符(串)(中文無效)出現(xiàn)的次數(shù)
awk -v RS='character' 'END {print --NR}' xxx.txt
find檢索命令
# 在目錄下找后綴是.mysql的文件
find /home/eagleye -name '*.mysql' -print
# 會從 /usr 目錄開始往下找葛圃,找最近3天之內(nèi)存取過的文件千扔。
find /usr -atime 3 –print
# 會從 /usr 目錄開始往下找,找最近5天之內(nèi)修改過的文件库正。
find /usr -ctime 5 –print
# 會從 /doc 目錄開始往下找曲楚,找jacky 的、文件名開頭是 j的文件诀诊。
find /doc -user jacky -name 'j*' –print
# 會從 /doc 目錄開始往下找洞渤,找尋文件名是 ja 開頭或者 ma開頭的文件。
find /doc \( -name 'ja*' -o- -name 'ma*' \) –print
# 會從 /doc 目錄開始往下找属瓣,找到凡是文件名結(jié)尾為 bak的文件,把它刪除掉讯柔。-exec 選項是執(zhí)行的意思抡蛙,rm 是刪除命令,{ } 表示文件名魂迄,“\;”是規(guī)定的命令結(jié)尾粗截。
find /doc -name '*bak' -exec rm {} \;
網(wǎng)絡相關(guān)
查看什么進程使用了該端口
lsof -i:port
獲取本機ip地址
/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"
iptables
# 查看iptables狀態(tài)
service iptables status
# 要封停一個ip
iptables -I INPUT -s ***.***.***.*** -j DROP
# 要解封一個IP,使用下面這條命令:
iptables -D INPUT -s ***.***.***.*** -j DROP
備注: 參數(shù)-I是表示Insert(添加)捣炬,-D表示Delete(刪除)熊昌。后面跟的是規(guī)則绽榛,INPUT表示入站,***.***.***.***表示要封停的IP婿屹,DROP表示放棄連接灭美。
#開啟9090端口的訪問
/sbin/iptables -I INPUT -p tcp --dport 9090 -j ACCEPT
# 防火墻開啟、關(guān)閉昂利、重啟
/etc/init.d/iptables status
/etc/init.d/iptables start
/etc/init.d/iptables stop
/etc/init.d/iptables restart
nc命令, tcp調(diào)試利器
#給某一個endpoint發(fā)送TCP請求,就將data的內(nèi)容發(fā)送到對端
nc 192.168.0.11 8000 < data.txt
#nc可以當做服務器届腐,監(jiān)聽某個端口號,把某一次請求的內(nèi)容存儲到received_data里
nc -l 8000 > received_data
#上邊只監(jiān)聽一次,如果多次可以加上-k參數(shù)
nc -lk 8000
tcpdump
# dump出本機12301端口的tcp包
tcpdump -i em1 tcp port 12301 -s 1500 -w abc.pcap
跟蹤網(wǎng)絡路由路徑
# traceroute默認使用udp方式, 如果是-I則改成icmp方式
traceroute -I www.163.com
# 從ttl第3跳跟蹤
traceroute -M 3 www.163.com
# 加上端口跟蹤
traceroute -p 8080 192.168.10.11
ss
# 顯示本地打開的所有端口
ss -l
# 顯示每個進程具體打開的socket
ss -pl
# 顯示所有tcp socket
ss -t -a
# 顯示所有的UDP Socekt
ss -u -a
# 顯示所有已建立的SMTP連接
ss -o state established '( dport = :smtp or sport = :smtp )'
# 顯示所有已建立的HTTP連接
ss -o state established '( dport = :http or sport = :http )'
找出所有連接X服務器的進程
ss -x src /tmp/.X11-unix/*
列出當前socket統(tǒng)計信息
ss -s
解釋:netstat是遍歷/proc下面每個PID目錄蜂奸,ss直接讀/proc/net下面的統(tǒng)計信息犁苏。所以ss執(zhí)行的時候消耗資源以及消耗的時間都比netstat少很多
netstat
# 輸出每個ip的連接數(shù),以及總的各個狀態(tài)的連接數(shù)
netstat -n | awk '/^tcp/ {n=split($(NF-1),array,":");if(n<=2)++S[array[(1)]];else++S[array[(4)]];++s[$NF];++N} END {for(a in S){printf("%-20s %s\n", a, S[a]);++I}printf("%-20s %s\n","TOTAL_IP",I);for(a in s) printf("%-20s %s\n",a, s[a]);printf("%-20s %s\n","TOTAL_LINK",N);}'
# 統(tǒng)計所有連接狀態(tài),
# CLOSED:無連接是活動的或正在進行
# LISTEN:服務器在等待進入呼叫
# SYN_RECV:一個連接請求已經(jīng)到達扩所,等待確認
# SYN_SENT:應用已經(jīng)開始围详,打開一個連接
# ESTABLISHED:正常數(shù)據(jù)傳輸狀態(tài)
# FIN_WAIT1:應用說它已經(jīng)完成
# FIN_WAIT2:另一邊已同意釋放
# ITMED_WAIT:等待所有分組死掉
# CLOSING:兩邊同時嘗試關(guān)閉
# TIME_WAIT:主動關(guān)閉連接一端還沒有等到另一端反饋期間的狀態(tài)
# LAST_ACK:等待所有分組死掉
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
# 查找較多time_wait連接
netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20
監(jiān)控linux性能命令
top
按大寫的 F 或 O 鍵,然后按 a-z 可以將進程按照相應的列進行排序, 然后回車祖屏。而大寫的 R 鍵可以將當前的排序倒轉(zhuǎn)
列名 | 含義 |
---|---|
PID | 進程id |
PPID | 父進程id |
RUSER | Real user name |
UID | 進程所有者的用戶id |
USER | 進程所有者的用戶名 |
GROUP | 進程所有者的組名 |
TTY | 啟動進程的終端名短曾。不是從終端啟動的進程則顯示為 ? |
PR | 優(yōu)先級 |
NI | nice值。負值表示高優(yōu)先級赐劣,正值表示低優(yōu)先級 |
P | 最后使用的CPU嫉拐,僅在多CPU環(huán)境下有意義 |
%CPU | 上次更新到現(xiàn)在的CPU時間占用百分比 |
TIME | 進程使用的CPU時間總計,單位秒 |
TIME+ | 進程使用的CPU時間總計魁兼,單位1/100秒 |
%MEM | 進程使用的物理內(nèi)存百分比 |
VIRT | 進程使用的虛擬內(nèi)存總量婉徘,單位kb。VIRT=SWAP+RES |
SWAP | 進程使用的虛擬內(nèi)存中咐汞,被換出的大小盖呼,單位kb。 |
RES | 進程使用的化撕、未被換出的物理內(nèi)存大小几晤,單位kb。RES=CODE+DATA |
CODE | 可執(zhí)行代碼占用的物理內(nèi)存大小植阴,單位kb |
DATA | 可執(zhí)行代碼以外的部分(數(shù)據(jù)段+棧)占用的物理內(nèi)存大小蟹瘾,單位kb |
SHR | 共享內(nèi)存大小,單位kb |
nFLT | 頁面錯誤次數(shù) |
nDRT | 最后一次寫入到現(xiàn)在掠手,被修改過的頁面數(shù)憾朴。 |
S | 進程狀態(tài)。D=不可中斷的睡眠狀態(tài),R=運行,S=睡眠,T=跟蹤/停止,Z=僵尸進程 |
COMMAND | 命令名/命令行 |
WCHAN | 若該進程在睡眠喷鸽,則顯示睡眠中的系統(tǒng)函數(shù)名 |
Flags | 任務標志众雷,參考 sched.h |
dmesg,查看系統(tǒng)日志
dmesg
iostat,磁盤IO情況監(jiān)控
iostat -xz 1
# r/s, w/s, rkB/s, wkB/s:分別表示每秒讀寫次數(shù)和每秒讀寫數(shù)據(jù)量(千字節(jié))。讀寫量過大,可能會引起性能問題砾省。
# await:IO操作的平均等待時間鸡岗,單位是毫秒。這是應用程序在和磁盤交互時编兄,需要消耗的時間轩性,包括IO等待和實際操作的耗時。如果這個數(shù)值過大翻诉,可能是硬件設備遇到了瓶頸或者出現(xiàn)故障炮姨。
# avgqu-sz:向設備發(fā)出的請求平均數(shù)量。如果這個數(shù)值大于1碰煌,可能是硬件設備已經(jīng)飽和(部分前端硬件設備支持并行寫入)舒岸。
# %util:設備利用率。這個數(shù)值表示設備的繁忙程度芦圾,經(jīng)驗值是如果超過60蛾派,可能會影響IO性能(可以參照IO操作平均等待時間)。如果到達100%个少,說明硬件設備已經(jīng)飽和洪乍。
# 如果顯示的是邏輯設備的數(shù)據(jù),那么設備利用率不代表后端實際的硬件設備已經(jīng)飽和夜焦。值得注意的是壳澳,即使IO性能不理想,也不一定意味這應用程序性能會不好茫经,可以利用諸如預讀取巷波、寫緩存等策略提升應用性能。
free,內(nèi)存使用情況
free -m
eg:
total used free shared buffers cached
Mem: 1002 769 232 0 62 421
-/+ buffers/cache: 286 715
Swap: 1153 0 1153
第一部分Mem行:
total 內(nèi)存總數(shù): 1002M
used 已經(jīng)使用的內(nèi)存數(shù): 769M
free 空閑的內(nèi)存數(shù): 232M
shared 當前已經(jīng)廢棄不用,總是0
buffers Buffer 緩存內(nèi)存數(shù): 62M
cached Page 緩存內(nèi)存數(shù):421M
關(guān)系:total(1002M) = used(769M) + free(232M)
第二部分(-/+ buffers/cache):
(-buffers/cache) used內(nèi)存數(shù):286M (指的第一部分Mem行中的used – buffers – cached)
(+buffers/cache) free內(nèi)存數(shù): 715M (指的第一部分Mem行中的free + buffers + cached)
可見-buffers/cache反映的是被程序?qū)崒嵲谠诔缘舻膬?nèi)存,而+buffers/cache反映的是可以挪用的內(nèi)存總數(shù).
第三部分是指交換分區(qū)
sar,查看網(wǎng)絡吞吐狀態(tài)
# sar命令在這里可以查看網(wǎng)絡設備的吞吐率卸伞。在排查性能問題時抹镊,可以通過網(wǎng)絡設備的吞吐量,判斷網(wǎng)絡設備是否已經(jīng)飽和
sar -n DEV 1
#
# sar命令在這里用于查看TCP連接狀態(tài)荤傲,其中包括:
# active/s:每秒本地發(fā)起的TCP連接數(shù)垮耳,既通過connect調(diào)用創(chuàng)建的TCP連接;
# passive/s:每秒遠程發(fā)起的TCP連接數(shù)遂黍,即通過accept調(diào)用創(chuàng)建的TCP連接终佛;
# retrans/s:每秒TCP重傳數(shù)量;
# TCP連接數(shù)可以用來判斷性能問題是否由于建立了過多的連接妓湘,進一步可以判斷是主動發(fā)起的連接查蓉,還是被動接受的連接。TCP重傳可能是因為網(wǎng)絡環(huán)境惡劣榜贴,或者服務器壓力過大導致丟包
sar -n TCP,ETCP 1
vmstat, 給定時間監(jiān)控CPU使用率, 內(nèi)存使用, 虛擬內(nèi)存交互, IO讀寫
# 2表示每2秒采集一次狀態(tài)信息, 1表示只采集一次(忽略既是一直采集)
vmstat 2 1
eg:
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 3499840 315836 3819660 0 0 0 1 2 0 0 0 100 0
0 0 0 3499584 315836 3819660 0 0 0 0 88 158 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 2 86 162 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 10 81 151 0 0 100 0
1 0 0 3499732 315836 3819660 0 0 0 2 83 154 0 0 100 0
- r 表示運行隊列(就是說多少個進程真的分配到CPU),我測試的服務器目前CPU比較空閑,沒什么程序在跑唬党,當這個值超過了CPU數(shù)目鹃共,就會出現(xiàn)CPU瓶頸了。這個也和top的負載有關(guān)系驶拱,一般負載超過了3就比較高霜浴,超過了5就高,超過了10就不正常了蓝纲,服務器的狀態(tài)很危險阴孟。top的負載類似每秒的運行隊列。如果運行隊列過大税迷,表示你的CPU很繁忙永丝,一般會造成CPU使用率很高。
- b 表示阻塞的進程,這個不多說箭养,進程阻塞慕嚷,大家懂的。
- swpd 虛擬內(nèi)存已使用的大小毕泌,如果大于0喝检,表示你的機器物理內(nèi)存不足了,如果不是程序內(nèi)存泄露的原因撼泛,那么你該升級內(nèi)存了或者把耗內(nèi)存的任務遷移到其他機器挠说。
- free 空閑的物理內(nèi)存的大小愿题,我的機器內(nèi)存總共8G损俭,剩余3415M抠忘。
- buff Linux/Unix系統(tǒng)是用來存儲崎脉,目錄里面有什么內(nèi)容,權(quán)限等的緩存灶体,我本機大概占用300多M
- cache cache直接用來記憶我們打開的文件,給文件做緩沖阅签,我本機大概占用300多M(這里是Linux/Unix的聰明之處政钟,把空閑的物理內(nèi)存的一部分拿來做文件和目錄的緩存,是為了提高 程序執(zhí)行的性能,當程序使用內(nèi)存時养交,buffer/cached會很快地被使用精算。)
- si 每秒從磁盤讀入虛擬內(nèi)存的大小,如果這個值大于0碎连,表示物理內(nèi)存不夠用或者內(nèi)存泄露了灰羽,要查找耗內(nèi)存進程解決掉。我的機器內(nèi)存充裕鱼辙,一切正常廉嚼。
- so 每秒虛擬內(nèi)存寫入磁盤的大小,如果這個值大于0倒戏,同上怠噪。
- bi 塊設備每秒接收的塊數(shù)量,這里的塊設備是指系統(tǒng)上所有的磁盤和其他塊設備峭梳,默認塊大小是1024byte舰绘,我本機上沒什么IO操作,所以一直是0葱椭,但是我曾在處理拷貝大量數(shù)據(jù)(2-3T)的機器上看過可以達到140000/s捂寿,磁盤寫入速度差不多140M每秒
- bo 塊設備每秒發(fā)送的塊數(shù)量,例如我們讀取文件孵运,bo就要大于0秦陋。bi和bo一般都要接近0,不然就是IO過于頻繁治笨,需要調(diào)整驳概。
- in 每秒CPU的中斷次數(shù),包括時間中斷
- cs 每秒上下文切換次數(shù)旷赖,例如我們調(diào)用系統(tǒng)函數(shù)顺又,就要進行上下文切換,線程的切換等孵,也要進程上下文切換稚照,這個值要越小越好,太大了俯萌,要考慮調(diào)低線程或者進程的數(shù)目,例如在apache和nginx這種web服務器中果录,我們一般做性能測試時會進行幾千并發(fā)甚至幾萬并發(fā)的測試,選擇web服務器的進程可以由進程或者線程的峰值一直下調(diào)咐熙,壓測弱恒,直到cs到一個比較小的值,這個進程和線程數(shù)就是比較合適的值了棋恼。系統(tǒng)調(diào)用也是返弹,每次調(diào)用系統(tǒng)函數(shù)锈玉,我們的代碼就會進入內(nèi)核空間,導致上下文切換琉苇,這個是很耗資源嘲玫,也要盡量避免頻繁調(diào)用系統(tǒng)函數(shù)悦施。上下文切換次數(shù)過多表示你的CPU大部分浪費在上下文切換并扇,導致CPU干正經(jīng)事的時間少了,CPU沒有充分利用抡诞,是不可取的穷蛹。
- us 用戶CPU時間,我曾經(jīng)在一個做加密解密很頻繁的服務器上昼汗,可以看到us接近100,r運行隊列達到80(機器在做壓力測試肴熏,性能表現(xiàn)不佳)。
- sy 系統(tǒng)CPU時間顷窒,如果太高蛙吏,表示系統(tǒng)調(diào)用時間長,例如是IO操作頻繁鞋吉。
- id 空閑 CPU時間鸦做,一般來說,id + us + sy = 100,一般我認為id是空閑CPU使用率谓着,us是用戶CPU使用率,sy是系統(tǒng)CPU使用率赊锚。
- wt 等待IO CPU時間。