現場問題 swap 頻繁交換導致系統CPU過高

2022-08-23 01:03:14 字數 4071 閱讀 2382

問題描述:

zabbix告警postgres vmcpu使用率過高

進入系統檢視top

檢視記憶體使用:

進入postgres看到真正執行的sql總共有105個,其中還有全表掃瞄

分析kswapd0程序cpu過高原因:由於資料庫在同一時刻點大量sql掃瞄同一張表,雖然有索引,但還是觸發大量資料載入到記憶體,並且期間還有vacuum操作,導致系統快取不足,系統頻繁進行資料交換。 

swap交換分割槽:

swap分割槽的作用是當物理記憶體不足時,會將一部分硬碟當做虛擬記憶體來使用。

kswapd0 占用過高是因為 物理記憶體不足,使用swap分割槽與記憶體換頁操作交換資料,導致cpu占用過高。

,數值越大表示更多的使用swap分割槽

swap 分割槽和記憶體 都有快取區,快取的內容為之前使用過的資料,用於加快第二次開啟時訪問速度。

swap分割槽 可以使用多個交換區(使用多硬碟?) 來加快swap訪問速度

swap 分割槽使用的為硬碟的內容,速度比直接訪問記憶體慢幾千倍

kswapd0的作用:

kswapd0程序的作用:它是虛擬記憶體管理中,負責換頁的,作業系統每過一定時間就會喚醒kswapd ,看看記憶體是否緊張,如果不緊張,則睡眠,在 kswapd 中,有2 個閥值,pages_hige 和 pages_low,當空閒記憶體頁的數量低於 pages_low 的時候,kswapd程序就會掃瞄記憶體並且每次釋放出32 個free pages,直到 free

page 的數量到達pages_high。通過阻止kswapd0程序過渡活躍地消耗cpu的方法是設定大頁記憶體。

————————————————

常用排查方法

一、檢查共享記憶體,檢視是否有 locked 的情況

[root@iz23hh6yk41z ~]# ipcs -m
二、檢查物理記憶體是否有空閒,以及swap使用情況

三、為避免kswapd0程序進行的無謂掃瞄,來檢測是否有能被swap out的頁,按照如下步驟啟用大記憶體頁(大記憶體頁好處是永遠不會被swap out)

1、設定/etc/security/limits.conf

[root@iz23hh6yk41z ~]# cat >> /etc/security/limits.conf 

*soft memlock unlimited

*hard memlock unlimited

end[root@iz23hh6yk41z ~]# ulimit -hl

unlimited

[root@iz23hh6yk41z ~]# ulimit -sl

unlimited

2、設定大記憶體頁,計算大記憶體頁的數量,注意執行這一步的時候必須保證例項至少啟動到nomount狀態

[root@iz23hh6yk41z ~]# ipcs -m

------ shared memory segments --------key shmid owner perms bytes nattch status

0x00000000

1402961920 root 600

524288

17dest

0x68013082

993165313 zabbix 600

16777216

29locked

0x68011f60

1529741314 zabbix 600

1560281088

29locked

0x48013082

993198083 zabbix 600

4194304

29locked

[root@iz23hh6yk41z ~]# cat /proc/meminfo | grep

hugepagesize

hugepagesize:

2048

kb最終需要的hugepages=(16777216/2048/1024+1)+(1560281088/2048/1024+1)+(4194304/2048/1024+1)=757

[root@iz23hh6yk41z ~]# echo

"vm.nr_hugepages=757

" >> /etc/sysctl.conf

[root@iz23hh6yk41z ~]# sysctl -p

[root@iz23hh6yk41z ~]# sysctl -n vm.nr_hugepages

757[root@iz23hh6yk41z ~]# grep hugepages /proc/meminfo

anonhugepages:

45056

kbhugepages_total:

757hugepages_free:

757hugepages_rsvd:

0hugepages_surp:

0[root@iz23hh6yk41z ~]# ipcs -m #重新檢查共享記憶體,發現locked已經沒有了

[root@iz23hh6yk41z ~]# grep hugepages /proc/meminfo

anonhugepages:

75776

kbhugepages_total:

757hugepages_free:

624hugepages_rsvd:

621hugepages_surp:

0

備註:free < total,說明已經有huge page被使用了

擴充套件問題:events/0 大量消耗cpu

中斷的底半部機制有三種:軟中斷、tasklet和工作佇列。其中軟中斷很少使用,核心中只有網路在使用,它的延時是最小的。

tasklet是軟中斷的乙個應用,所有執行緒註冊的tasklet都會順序被執行。因此tasklet的執行環境是軟中斷上下文,所以不能阻塞或者睡眠。一般情況下,tasklet的延遲也很小,可以滿足大部分需求。

要是底半部中可能睡眠,那麼只好使用工作佇列了。工作佇列其實是把要做的底半部的函式交給核心的專門執行緒去呼叫。這樣工作佇列就執行於執行緒環境了,不怕睡眠。當然,睡眠會影響註冊到同一執行緒的其它底半部的執行,但不會引起大的問題。每個cpu都有乙個執行緒(events/n,n是編號)負責執行工作佇列,第乙個cpu的執行緒是events/0,如果是雙核的,還會有乙個events/1執行緒。程式使用了工作佇列,所以每次執行都會多出乙個events/0(第乙個cpu上工作執行緒)。

核心的軟中斷輔助處理執行緒ksoftirqd/n(n是cpu編號),它們負責出發軟中斷中觸發的軟中斷。它們將重新觸發軟中斷放在系統空閒時呼叫,而不是馬上。這樣使用者空間不至於飢餓,重新觸發的軟中斷也得以盡快執行。

物理記憶體不足,引起 swap 頻繁。其實這也是 vps 使用上的乙個常見的問題了,通常是由 apache/nginx 占用記憶體過多引起的。kswapd0 是系統的虛擬記憶體管理程式,如果物理記憶體不夠用,系統就會喚醒 kswapd0 程序,由 kswapd0 分配磁碟交換空間作快取,因而占用大量的 cpu 資源。重啟apache/nginx,釋放記憶體,問題就會消失。但這不是長久之計,最好的方法還是花點錢公升級下記憶體。

vm.min_free_kbytes 設定過高,導致 kswapd0 消耗大量 cpu

linux上設定大記憶體頁解決kswapd0程序過渡消耗cpusys的問題

SWAP導致的效能問題

db維護過程中,我們常說的使用太多swap會導致效能問題,原因是 當應用程式要請求新的記憶體頁的時候,如果已經沒有足夠的物理記憶體,就會把目前物理記憶體中的一部分空間釋放出來,以供當前執行的程式使用。這部分被釋放的空間可能屬於某乙個程式,並且所謂的釋放,是把這部分記憶體頁存放到swap空間。如果這個...

頻繁分配釋放記憶體導致的效能問題的分析

現象 1 壓力測試過程中,發現被測物件效能不夠理想,具體表現為 程序的系統態cpu消耗20,使用者態cpu消耗10,系統idle大約70 2 用ps o majflt,minflt c program命令檢視,發現majflt每秒增量為0,而minflt每秒增量大於10000。初步分析 majflt...

頻繁分配釋放記憶體導致的效能問題的分析

徵兆 1.system cpu佔用率偏高。2.執行命令 用ps o majflt,minflt c program命令檢視,majflt或者minflt每秒增量很大。原因 頻繁的分配釋放記憶體,導致缺頁中斷次數很高。而缺頁中斷的處理是由系統在核心態完成的,所以system cpu利用率偏高,導致效能...