A. linux cpu使用率过高排查
方法一
第一步:使用
top命令,然后按shift+p按照CPU排序
找到占用CPU过高的进程的pid
第二步:使用
top -H -p [进程id]
找到进程中消耗资源最高的线程的id
第三步:使用
echo 'obase=16;[线程id]' | bc或者printf "%x
" [线程id]
将线程id转换为16进制(字母要小写)
bc是linux的计算器命令
第四步:执行
jstack [进程id] |grep -A 10 [线程id的16进制]”
查看线程状态信息
方法二
第一步:使用
top命令,然后按shift+p按照CPU排序
找到占用CPU过高的进程
第二步:使用
ps -mp pid -o THREAD,tid,time | sort -rn
获取线程信息,并找到占用CPU高的线程
第三步:使用
echo 'obase=16;[线程id]' | bc或者printf "%x
" [线程id]
将需要的线程ID转换为16进制格式
第四步:使用
jstack pid |grep tid -A 30 [线程id的16进制]
打印线程的堆栈信息
案例分析
场景描述
生产环境下java进程高CPU占用故障排查
解决过程
1、根据top命令,发现PID为2633的Java进程占用CPU高达300%,出现故障。
2、找到该进程后,如何定位具体线程或代码呢,首先显示线程列表,并按照CPU占用高的线程排序:
1[root@localhost ~]# ps -mp 2633 -o THREAD,tid,time | sort -rn
显示结果如下:
化主动为被动的方式,一方面减轻了运维工程师的工作,另一方面也减小了运维漏看或者忽略告警的情况发生。
B. cpu浣跨敤鐜囬珮鎬庝箞瑙e喅鏁欎綘姝g‘瑙e喅鐢佃剳cpu楂樻俯鎶宸
鏁欎綘姝g‘瑙e喅鐢佃剳cpu楂樻俯鎶宸,cpu浣跨敤鐜囬珮鎬庝箞瑙e喅銆
cpu浣跨敤鐜囬珮鎬庝箞瑙e喅
涓虹綉鍙嬩滑瑙g瓟cpu浣跨敤鐜囬珮鎬庝箞瑙e喅鍜屾暀浣犳g‘瑙e喅鐢佃剳cpu楂樻俯鎶宸х殑IT灏忕粡楠岋紝涓嬮潰鎴戜负鎮ㄨ︾粏瑙g瓟
鐢佃剳CPU鍗犵敤杩囬珮鍙鑳藉艰嚧绯荤粺鎬ц兘涓嬮檷锛屽奖鍝嶆e父浣跨敤銆傛湰鏁欑▼灏嗕负鎮ㄨ︾粏浠嬬粛澶氱嶆柟娉曪紝浠庤蒋浠朵紭鍖栧埌绯荤粺璋冩暣锛屽府鍔╂偍瑙e喅鐢佃剳CPU鍗犵敤杩囬珮鐨勯棶棰橈紝鎭㈠嶇數鑴戠殑椤虹晠杩愯屻
涓銆佷负浠涔圕PU娓╁害浼氳繃楂橈紵
鐢佃剳CPU鍗犵敤杩囬珮鍙鑳界敱澶氱嶅師鍥犲紩璧凤紝浣嗛氳繃鏌ユ壘鍗犵敤CPU鐨勮繘绋嬨佸叧闂涓嶅繀瑕佺殑鍚庡彴绋嬪簭銆佹洿鏂拌蒋浠跺拰椹卞姩绋嬪簭锛屼互鍙婅繘琛岀郴缁熻皟鏁村拰纭浠舵鏌ワ紝鎮ㄥ彲浠ヨВ鍐宠繖涓闂棰橈紝鎻愰珮鐢佃剳鎬ц兘锛岀‘淇濋『鐣呰繍琛屻傛牴鎹鍏蜂綋鎯呭喌锛岄夋嫨閫傚綋鐨勬柟娉曟潵鎺掓煡鍜岃В鍐抽棶棰橈紝璁╂偍鐨勭數鑴戞仮澶嶅埌鏈浣崇姸鎬併
浜屻佹湁鏁堣В鍐矯PU娓╁害杩囬珮鐨勬柟娉曪細
娓呮磥鐢佃剳鍐呴儴锛
瀹氭湡娓呯悊鐢佃剳鍐呴儴鐨勭伆灏樺拰姹″灑鏄瑙e喅CPU娓╁害杩囬珮鐨勯栬佹ラゃ傞栧厛锛屽叧闂鐢佃剳锛屾柇寮鐢垫簮骞舵嫈涓嬬數婧愮嚎銆傜劧鍚庯紝灏忓績鍦版墦寮鐢佃剳鏈虹憋紝浣跨敤鍘嬬缉绌烘皵鍚规壂鍐呴儴鐏板皹銆傜壒鍒娉ㄦ剰娓呯悊CPU椋庢墖鍜屾暎鐑鍣锛岀‘淇濆畠浠娌℃湁鍫靛炪
鏇存崲鏁g儹鑳讹細
鏁g儹鑳舵槸杩炴帴CPU鍜屾暎鐑鍣ㄧ殑鐑瀵间粙璐锛屽畠鏈変竴瀹氱殑浣跨敤瀵垮懡銆傚侰PU娓╁害杩囬珮锛屾湁鍙鑳芥槸鏁g儹鑳跺け鏁堜簡銆傚彲浠ヨ喘涔伴傚悎鑷宸盋PU鐨勬暎鐑鑳讹紝骞舵寜鐓ц存槑杩涜屾洿鎹銆
鎻愬崌鏁g儹鎬ц兘锛
纭淇濈數鑴戠殑鏁g儹绯荤粺鑹濂借繍浣溿傚彲浠ュ畨瑁呮洿澶с佹洿楂樻晥鐨勯庢墖鎴栨按鍐风郴缁熸潵鎻愰珮鏁g儹鎬ц兘銆傛ゅ栵紝浣跨敤鏁g儹鍨鎴栨暎鐑搴曞骇涔熸槸鏈夋晥鐨勬暎鐑澧炲己鏂瑰紡銆
鍚堢悊浣跨敤鐢佃剳锛
1.鎵撳紑浠诲姟绠$悊鍣锛屽彲浠ラ氳繃鎸変笅鈥淐trl + Shift + Esc鈥濈粍鍚堥敭鎴栬呭彸閿鐐瑰嚮浠诲姟鏍忛夋嫨鈥滀换鍔$$悊鍣ㄢ濇潵鎵撳紑銆
2.鍦ㄢ滆繘绋嬧濋夐」鍗′腑锛屾壘鍒板崰鐢–PU杈冮珮鐨勮繘绋嬨
鏁欎綘姝g‘瑙e喅鐢佃剳cpu楂樻俯鎶宸,cpu浣跨敤鐜囬珮鎬庝箞瑙e喅銆
cpu浣跨敤鐜囬珮鎬庝箞瑙e喅
鎻愰珮鐜澧冩俯搴︼細
濡傛灉鍛ㄥ洿鐜澧冩俯搴﹁繃楂橈紝浼氬姞閲嶇數鑴戞暎鐑璐熸媴銆傚彲浠ヤ娇鐢ㄧ┖璋冩垨鐢甸庢墖鏉ラ檷浣庡ゆ俯锛屾湁鍔╀簬鍑忚交CPU鐨勮礋鑽枫
鏇存柊椹卞姩绋嬪簭鍜岀郴缁燂細
鍙婃椂鏇存柊鎿嶄綔绯荤粺鍜岀‖浠堕┍鍔ㄧ▼搴忥紝浠ョ‘淇濆叾涓庢渶鏂扮殑浼樺寲鍜屼慨澶嶇浉鍖归厤锛屼粠鑰岄檷浣嶤PU鍥犺蒋浠堕棶棰樺艰嚧鐨勯珮娓┿
涓嶈秴棰戯細
瓒呴戞槸涓绉嶅皢CPU鎬ц兘鎻愬崌鐨勬柟娉曪紝浣嗕篃浼氬艰嚧鏇撮珮鐨勫姛鑰楀拰娓╁害銆傚傛灉鎮ㄧ殑CPU娓╁害宸茬粡鍋忛珮锛屽缓璁涓嶈佽繘琛岃秴棰戞搷浣溿
缁间笂鎵杩帮紝淇濇寔鐢佃剳CPU娓╁害鍦ㄥ悎鐞嗚寖鍥村唴鏄淇濇姢鐢佃剳鍋ュ悍鐨勫叧閿銆傞氳繃瀹氭湡娓呮磥銆佷紭鍖栨暎鐑銆佸悎鐞嗕娇鐢ㄧ數鑴戜互鍙婃彁楂樼幆澧冩俯搴︾瓑鏂规硶锛屾偍鍙浠ラ檷浣嶤PU娓╁害锛屽欢闀跨數鑴戝垮懡锛屽苟纭淇濈數鑴戝湪楂樻晥杩愯岀殑鍚屾椂淇濇寔绋冲畾鎬с
涓婅堪灏辨槸cpu浣跨敤鐜囬珮鎬庝箞瑙e喅 浠ュ強 鏁欎綘姝g‘瑙e喅鐢佃剳cpu楂樻俯鎶宸х殑鍏ㄩ儴鍐呭癸紝鎮ㄤ簡瑙d簡鍚楋紵
C. linux鐨刢pu璐熻浇杩囬珮linux鐨刢pu璐熻浇
鏈嶅姟鍣–PU璐熻浇杩囬珮锛屽備綍瀹氫綅闂棰橈紵
涓涓搴旂敤鍗犵敤CPU寰堥珮锛岄櫎浜嗙‘瀹炴槸璁$畻瀵嗛泦鍨嬪簲鐢ㄤ箣澶栵紝閫氬父鍘熷洜閮芥槸鍑虹幇浜嗘诲惊鐜銆侰PU璐熻浇杩囬珮瑙e喅闂棰樿繃绋嬶細
浣跨敤銆恡op銆戝懡浠ゅ畾浣嶅紓甯歌繘绋嬶紝鍙鍙戠幇12836鐨凜PU鍜屽唴瀛樺崰鐢ㄧ巼閮介潪甯搁珮
澶囨敞锛歵op鍛戒护榛樿ゆ儏鍐典笅锛屾槸姣3绉掑埛鏂颁竴娆°備篃鍙浠ラ氳繃top-d鍒锋柊鏃堕棿闂撮殧>鏉ユ寚瀹氬埛鏂伴戠巼锛屽倀op-d0.1鎴杢op-d0.01绛夈倀op鎵ц屾椂锛屼篃鍙浠ユ寜鈥渟鈥濋敭锛屼慨鏀规椂闂撮棿闅斻
浣跨敤銆恡op-H-p杩涚▼鍙枫戞煡鐪嬪紓甯哥嚎绋
浣跨敤銆恜rintf"%xn"绾跨▼鍙枫戝皢寮傚父绾跨▼鍙疯浆鍖栦负16杩涘埗
浣跨敤銆恓stack杩涚▼鍙穦grep16杩涘埗寮傚父绾跨▼鍙-A90銆戞潵瀹氫綅寮傚父浠g爜鐨勪綅缃锛堟渶鍚庣殑-A90鏄鏃ュ織琛屾暟锛屼篃鍙浠ヨ緭鍑轰负鏂囨湰鏂囦欢鎴栦娇鐢ㄥ叾浠栨暟瀛楋級銆傚彲浠ョ湅鍒板紓甯镐唬鐮佺殑浣嶇疆銆
鎵惧埌鐩稿簲浠g爜妫鏌ワ紝鍙戠幇纭瀹炴湁姝诲惊鐜瀛樺湪銆
鎺掓煡CPU鏁呴殰鐨勫父鐢ㄥ懡浠わ細
top鍛戒护锛歀inux鍛戒护銆傚彲浠ユ煡鐪嬪疄鏃剁殑CPU浣跨敤鎯呭喌銆備篃鍙浠ユ煡鐪嬫渶杩戜竴娈垫椂闂寸殑CPU浣跨敤鎯呭喌銆
PS鍛戒护锛歀inux鍛戒护銆傚己澶х殑杩涚▼鐘舵佺洃鎺у懡浠ゃ傚彲浠ユ煡鐪嬭繘绋嬩互鍙婅繘绋嬩腑绾跨▼鐨勫綋鍓岰PU浣跨敤鎯呭喌銆傚睘浜庡綋鍓嶇姸鎬佺殑閲囨牱鏁版嵁銆
jstack锛欽ava鎻愪緵鐨勫懡浠ゃ傚彲浠ユ煡鐪嬫煇涓杩涚▼鐨勫綋鍓嶇嚎绋嬫爤杩愯屾儏鍐点傛牴鎹杩欎釜鍛戒护鐨勮緭鍑哄彲浠ュ畾浣嶆煇涓杩涚▼鐨勬墍鏈夌嚎绋嬬殑褰撳墠杩愯岀姸鎬併佽繍琛屼唬鐮侊紝浠ュ強鏄鍚︽婚攣绛夌瓑銆
pstack锛歀inux鍛戒护銆傚彲浠ユ煡鐪嬫煇涓杩涚▼鐨勫綋鍓嶇嚎绋嬫爤杩愯屾儏鍐点
D. Linux里面cpu占用太高排查思路是什么
可以通过top命令来查看占用cpu的软件看是否有僵尸进程在占用cpu如果可以通过kill杀死无用的进程!
E. linux cpu占用较高
Linux服务器上出现CPU负载达到100%居高不下的情况,如果CPU 持续跑高,则会影响业务系统的正常运行; CPU利用率。根据经验来看,用户空间进程占用CPU比例在 65-70%。一般不能超过这个比例,超过这个比例,系统性能就会降低,平均负载升高,这点将会在下面的测试中看到。
进程上下文切换。上下文切换和CPU利用率应该联系起来,如果CPU利用率低,那么上下文切换稍高点也能接受。上下文切换也是需要消耗CPU资源的,频繁的切换必将使得CPU利用率升高。
运行队列中等待运行的进程数。每个CPU核心中等待处理的进程数不应该超过3个线程/进程。如4核心的机器,那么队列的最大值应该不超过12个。
对于CPU过载问题通常使用以下两种方式即可快速定位(不能涵盖所有特殊情况,请作为其中的参考排查思路):
一、排查分析
方法一(针对JAVA应用):
第一步:使用
top命令,然后按shift+p按照CPU排序
找到占用CPU过高的进程的pid
第二步:使用
top -H -p [进程id]
找到进程中消耗资源最高的线程的id
第三步:使用
echo 'obase=16;[线程id]' | bc或者printf "%x\n" [线程id]
将线程id转换为16进制(字母要小写)
bc是linux的计算器命令
第四步(此步骤可以和相对应的java开发进行一起排查):执行
jstack [进程id] |grep -A 10 [线程id的16进制]”
查看线程状态信息
二、kswapd0 进程占用 CPU 较高
操作系统都用分页机制来管理物理内存,操作系统将磁盘的一部分划出来作为虚拟内存,由于内存的速度要比磁盘快得多,所以操作系统要按照某种换页机制将不需要的页面换到磁盘中,将需要的页面调到内存中,由于内存持续不足,这个换页动作持续进行,kswapd0 是虚拟内存管理中负责换页的,当服务器内存不足的时候 kswapd0 会执行换页操作,这个换页操作是十分消耗主机 CPU 资源的。如果通过 top 发现该进程持续处于非睡眠状态,且运行时间较长,可以初步判定系统在持续的进行换页操作,可以将问题转向内存不足的原因来排查。