linux vps服務(wù)器進(jìn)程kswapd0與events/0消耗大量CPU的問題
今天下午網(wǎng)站宕了兩次機(jī),發(fā)工單給阿里云,發(fā)現(xiàn)原因是服務(wù)器的CPU 100%了。
重啟服務(wù)器后,使用 top 命令看看是哪些進(jìn)程消耗那么大的 CPU 使用。盯了有好十幾分鐘,主要消耗 CPU 的進(jìn)程有兩個,一個是 mysql,另一個是 apache。下面的圖可以看到,mysql 占用了很大部分的 CPU 使用。apache 單個進(jìn)程雖然占得不多,但有不少個 apache 進(jìn)程同時存在,也消耗了不少 CPU 的使用。
當(dāng)然,這些不足以讓服務(wù)器的 CPU 直接跑滿掛掉,后來發(fā)現(xiàn)了兩個大家伙:
當(dāng) mysql 的 CPU 消耗降下來之后,出現(xiàn)了兩個奇怪的進(jìn)程:kswapd0 和 events/0。
1. kswapd0
Linux uses kswapd for virtual memory management such that pages that have been recently accessed are kept in memory and less active pages are paged out to disk.
(what is a page?)…Linux uses manages memory in units called pages.
So,the kswapd process regularly decreases the ages of unreferenced pages…and at the end they are paged out(moved out) to disk
kswapd0進(jìn)程的作用:它是虛擬內(nèi)存管理中,負(fù)責(zé)換頁的,操作系統(tǒng)每過一定時間就會喚醒kswapd ,看看內(nèi)存是否緊張,如果不緊張,則睡眠,在 kswapd 中,有2 個閥值,pages_hige 和 pages_low,當(dāng)空閑內(nèi)存頁的數(shù)量低于 pages_low 的時候,kswapd進(jìn)程就會掃描內(nèi)存并且每次釋放出32 個free pages,直到 free page 的數(shù)量到達(dá)pages_high。
查看內(nèi)存使用率,發(fā)現(xiàn)內(nèi)存確實不夠用,有時候已經(jīng)使用到了swap。
2. events/0
另一個進(jìn)程 events/0 是工作者線程,主要是用來執(zhí)行delay work的。先簡單介紹一下。
我們都知道中斷的底半部機(jī)制有三種:軟中斷、tasklet和工作隊列。其中軟中斷很少使用,內(nèi)核中只有網(wǎng)絡(luò)在使用,它的延時是最小的。
tasklet是軟中斷的一個應(yīng)用,所有線程注冊的tasklet都會順序被執(zhí)行。因此tasklet的執(zhí)行環(huán)境是軟中斷上下文,所以不能阻塞或者睡眠。一般情況下,tasklet的延遲也很小,可以滿足大部分需求。
要是底半部中可能睡眠,那么只好使用工作隊列了。工作隊列其實是把要做的底半部的函數(shù)交給內(nèi)核的專門線程去調(diào)用。這樣工作隊列就運(yùn)行于線程環(huán)境了,不怕睡眠。當(dāng)然,睡眠會影響注冊到同一線程的其它底半部的執(zhí)行,但不會引起大的問題。每個CPU都有一個線程(events/n,n是編號)負(fù)責(zé)執(zhí)行工作隊列,第一個CPU的線程是events/0,如果是雙核的,還會有一個events/1線程。程序使用了工作隊列,所以每次執(zhí)行都會多出一個events/0(第一個CPU上工作線程)。
內(nèi)核的軟中斷輔助處理線程ksoftirqd/n(n是CPU編號),它們負(fù)責(zé)出發(fā)軟中斷中觸發(fā)的軟中斷。它們將重新觸發(fā)軟中斷放在系統(tǒng)空閑時調(diào)用,而不是馬上。這樣用戶空間不至于饑餓,重新觸發(fā)的軟中斷也得以盡快執(zhí)行。(《Linux內(nèi)核設(shè)計與實現(xiàn)》85頁)
宕機(jī)原因顯而易見了,physical mem 不足,引起 swap 頻繁。其實這也是 VPS 使用上的一個常見的問題了,通常是由 Apache 占用內(nèi)存過多引起的。kswapd0 是系統(tǒng)的虛擬內(nèi)存管理程序,如果物理內(nèi)存不夠用,系統(tǒng)就會喚醒 kswapd0 進(jìn)程,由 kswapd0 分配磁盤交換空間作緩存,因而占用大量的 CPU 資源。重啟Apache,釋放內(nèi)存,問題就會消失。但這不是長久之計,最好的方法還是花點(diǎn)錢升級下內(nèi)存。我也知道隨著訪問量的不斷上漲,肯定要升級下內(nèi)存,但是沒想到這個問題這么快就來了……
相關(guān)文章
Linux使用MySQL忘記root密碼及修改MySQL默認(rèn)編碼
本篇文章主要介紹了Linux使用MySQL忘記root密碼及修改MySQL默認(rèn)編碼,碰到這個問題的朋友可以參考下。2016-10-10分享十個便宜VPS主機(jī)-VPS服務(wù)器建站和搭建應(yīng)用服務(wù)體驗
這篇文章主要介紹了分享十個便宜VPS主機(jī)-VPS服務(wù)器建站和搭建應(yīng)用服務(wù)體驗,非常具有實用價值,需要的朋友可以參考下2017-07-07CentOS服務(wù)器初始化設(shè)置詳細(xì)說明
這篇文章主要介紹了CentOS服務(wù)器初始化設(shè)置詳細(xì)說明,需要的朋友可以參考下2018-01-01有效學(xué)習(xí)Linux系統(tǒng)的4個方法
這篇文章主要為大家詳細(xì)介紹了有效學(xué)習(xí)Linux系統(tǒng)的4個方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01Linux中使用Crontab定時監(jiān)測維護(hù)Tomcat應(yīng)用程序的方法
定時監(jiān)測發(fā)布的某項應(yīng)用程序是否可用,如果不可用,立即執(zhí)行處理措施,實現(xiàn)自動化運(yùn)維工作2014-11-11