可以用下面的命令將 cpu 占用率高的線程找出來:
成都創(chuàng)新互聯(lián)是專業(yè)的城西網(wǎng)站建設公司,城西接單;提供成都網(wǎng)站設計、成都做網(wǎng)站,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行城西網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu
這個命令首先指定參數(shù)'H',顯示線程相關的信息,格式輸出中包含:user,pid,ppid,tid,time,%cpu,cmd,然后再用%cpu字段進行排序。這樣就可以找到占用處理器的線程了。
直接使用 ps Hh -eo pid,tid,pcpu | sort -nk3 |tail 獲取對于的進程號和線程號,然后跳轉到3.
查看哪個進程線程占用cpu過高; top / ps -aux, 獲得進程號
確定哪個線程占用cpu過高,進入進程號的目錄:/proc/pid/task,
執(zhí)行:grep SleepAVG **/status | sort -k2,2 | head, 確定cpu占用較高的線程號。
使用kill -3 pid 會打印線程堆棧的情況
在 Linux 下 top 工具可以顯示 cpu 的平均利用率(user,nice,system,idle,iowait,irq,softirq,etc.),可以顯示每個 cpu 的利用率。但是無法顯示每個線程的 cpu 利用率情況,這時就可能出現(xiàn)這種情況,總的 cpu 利用率中 user 或 system 很高,但是用進程的 cpu 占用率進行排序時,沒有進程的 user 或 system 與之對應。
1。 使用top命令,具體用法是 top -H
加上這個選項,top的每一行就不是顯示一個進程,而是一個線程。
2。 使用ps命令,具體用法是 ps -xH
這樣可以查看所有存在的線程,也可以使用grep作進一步的過濾。
3。 使用ps命令,具體用法是 ps -mq PID
這樣可以看到指定的進程產生的線程數(shù)目。
更進一步,其實一些系統(tǒng)監(jiān)控工具,在本質上也是讀取的系統(tǒng)產生的文件罷了。比如說進程這個事情,
看看這個目錄吧,/proc/5000/ 這里面有你所有想要的。其實stat代表著當前的一些信息。
使用ps命令來查看進程的時候,進程狀態(tài)分別對應的含義如下:
D 不可中斷睡眠 (通常是在IO操作) 收到信號不喚醒和不可運行, 進程必須等待直到有中斷發(fā)生
R 正在運行或可運行(在運行隊列排隊中)
S 可中斷睡眠 (休眠中, 受阻, 在等待某個條件的形成或接受到信號)
T 已停止的 進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號后停止運行
W 正在換頁(2.6.內核之前有效)
X 死進程 (未開啟)
Z 僵尸進程 進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統(tǒng)調用后釋放BSD風格的
高優(yōu)先級(not nice to other users)
N 低優(yōu)先級(nice to other users)
L 頁面鎖定在內存(實時和定制的IO)
s 一個信息頭
l 多線程(使用 CLONE_THREAD,像NPTL的pthreads的那樣)
+ 在前臺進程組
查看系統(tǒng)允許的最大線程數(shù):
Linux無法直接控制單個進程可擁有的線程數(shù),但有參考公式max = VM/stack_size,默認stack為8k,可通過降低stack大小或增加虛擬內存來調大每個進程可擁有的最大線程數(shù);
對于支持多線程的程序如Java,有可能會遇到一個進程無法創(chuàng)建更多線程的情形,其原因多種多樣,而OS端可能由此參數(shù)造成.
查看系統(tǒng)允許的最大進程數(shù):
ulimit -a 顯示當前所有的資源限制
root用戶下執(zhí)行 ulimit -a 然后查看 max user processes 這個值通常是系統(tǒng)最大線程數(shù)的一半:/proc/sys/kernel/threads-max/2
普通用戶下 ulimit -u 出現(xiàn)的max user processes的值 默認是 /etc/security/limits.d/20-nproc.conf(centos6 是90-nproc.conf) 文件中的
普通用戶默認是1024
打開/etc/security/limits.conf (部分的系統(tǒng)是在/etc/security/limits.d/90-nproc.conf)
設置限制數(shù)量,第一列表示用戶,* 表示所有用戶
soft nproc :單個用戶可用的最大進程數(shù)量(超過會警告);
hard nproc:單個用戶可用的最大進程數(shù)量(超過會報錯);
soft nofile :可打開的文件描述符的最大數(shù)(超過會警告);
hard nofile :可打開的文件描述符的最大數(shù)(超過會報錯);
重啟后生效
reboot
查詢當前某程序的線程數(shù)
pstree -p 進程號 | wc -l
管道符號"|"左邊命令的輸出作為右邊命令的輸入
直接修改/etc/security/limits.conf 文件中的 * soft nproc 65535 值后,普通用戶最大進程數(shù)無法達到65535 ,因為用戶的max user processes的值,最后是受全局的kernel.pid_max的值限制。也就是說kernel.pid_max=1024 ,那么你用戶的max user processes的值是127426 ,用戶能打開的最大進程數(shù)還是1024。
永久修改系統(tǒng)最高進程數(shù)的方法
在/etc/sysctl.conf中添加kernel.pid_max = 65535
vim /etc/sysctl.conf
kernel.pid_max = 65535
或者:
echo "kernel.pid_max = 65535" /etc/sysctl.conf
然后重啟機器。
臨時修改的方法:
echo 65535 /proc/sys/kernel/pid_max
所以以上都操作完成后,才算是正確修改了max user processes 的值