国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Linux 內存變低會發生什么問題

系統 Linux
內存不是無限的,總有不夠用的時候,Linux內核用三個機制來處理這種情況:內存回收、內存規整、oom-kill。

作者 | cynrikluo

內存不是無限的,總有不夠用的時候,linux內核用三個機制來處理這種情況:內存回收、內存規整、oom-kill。

當發現內存不足時,內核會先嘗試內存回收,從一些進程手里拿回一些頁;如果這樣還是不能滿足申請需求,則觸發內存規整;再不行,則觸發oom主動kill掉一個不太重要的進程,釋放內存。

低內存情況下,內核的處理邏輯

內存申請的核心函數是__alloc_pages_nodemask:

/*
 * This is the 'heart' of the zoned buddy allocator.
 */
struct page *
__alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, int preferred_nid,
              nodemask_t *nodemask)
{
  struct page *page;
  unsigned int alloc_flags = ALLOC_WMARK_LOW;
  gfp_t alloc_mask; /* The gfp_t that was actually used for allocation */
  struct alloc_context ac = { }; 

__alloc_pages_nodemask會先嘗試調用get_page_from_freelist從伙伴系統的freelist里拿空閑頁,如果能拿到就直接返回:

如果拿不到,則進入慢速路徑:

__alloc_pages_slowpath,慢速路徑,顧名思義,就是拿得慢一點,需要做一些操作以后再拿。

首先, __alloc_pages_slowpath會喚醒kswapd:

kswapd是一個守護進程,專門進行內存回收操作,執行路徑:

它被喚醒后,會立1刻開始進行回收,效率高的話,freelist上會立刻多出很多空閑頁。

所以 __alloc_pages_slowpath會馬上再次嘗試從freelist獲取頁面,獲取成功則直接返回了。

若還是失敗, __alloc_pages_slowpath則會進入direct_reclaim階段:

direct_reclaim,顧名思義,就是直接內存回收,回收到的頁不用放回freelist再get_page_from_freelist這么麻煩了,也不用喚醒某個進程幫忙回收,而是由當前進程(current)親自下場去回收,執行路徑:

如果direct_reclaim也回收不上來, __alloc_pages_slowpath還會垂死掙扎下,做一下內存規整,嘗試把零散的頁輾轉騰挪,拼成為大order頁(僅在申請order>0的頁時有用)。

如果還是無法滿足要求,則進入oom-kill了:

總結上面的邏輯:內存申請時,首先嘗試直接從freelist里拿;失敗了則先喚醒kswapd幫忙回收內存;若內存低到讓kswapd也愛莫能助,則進入direct reclaim直接回收內存;若direct reclaim也無能為力,則oom:

三條水線

實際上,從freelist上拿頁不是簡單地直接拿,而是先檢查下該zone是否滿足水線要求,不滿足那就直接失敗。

內核給內存管理劃了三條水線:MIN、LOW、HIGH。

三者大小關系從字面即可推斷,MIN < LOW < HIGH。

在首次嘗試從freelist拿頁時,門檻水線是LOW;喚醒kswapd后再次嘗試拿頁,門檻水線是MIN。

所以實際邏輯如下:

所以,可以簡單地認為,可用內存低于LOW水線時,喚醒kswapd;低于MIN水線時,進行direct reclaim;而HIGH水線,是kswapd的回收終止線:

為什么內存回收時,磁盤IO會被打滿?

可以看到,kswapd和direct_reclaim最終都是走到了shrink_node:

shrink_node是內存回收的核心函數,顧名思義,讓整個node進行一次“收縮”,把不要的數據清掉,空出空閑頁。

get_scan_count決定本次掃描多少個anon page和file page。

anon page就是Anonymous Page,匿名頁,是進程的堆棧、數據段等。內核回收匿名頁時,將這些數據進行壓縮(壓縮比大概為3),然后移動到內存中的一個小角落中(swap空間),這個過程并沒有與磁盤發生交互,因此不會產生IO,但需要壓縮數據,所以耗CPU。

file page就是文件頁,是進程的代碼段、映射的文件。內核回收文件頁時,先將“臟”數據回寫到磁盤,然后釋放掉這些緩存數據,干凈的數據則直接釋放掉。這個過程涉及到寫磁盤,因此會產生IO。

簡單總結一下get_scan_count的邏輯:

所以說,不論開沒開swap,內存回收都是傾向于回收file page。

如果file page中有臟頁,那內存回收大概率就會產生一些IO,無非是IO量多少罷了。

以下情況IO可能會打滿或者暴增:

  • 當前內存不是特別緊張,但low、min水線設置得太低,之前一直沒怎么觸發過內存回收,以致于臟頁已經累積到大量,一觸發回收,立刻就是回寫大量臟頁,導致IO暴增。
  • 內存極度緊張 (free 和available同時很低)。這種情況下,anon page遠比file page多,這意味著可回收的內存很少,內核會對活躍數據下手,一些進程上一秒還用著的數據,這一秒可能就被不幸回收了,但下一秒馬上又要被使用,會再次被讀入內存。如此,同一份數據,內核就進行了多次回收和讀入,IO就加倍了。

為什么低內存有時會引發hungtask?

低內存時,通常不是個別進程觸發了direct reclaim,而是大量進程都在direct reclaim。

大家都要回寫臟頁,于是IO被打滿了。

這時候,進程會頻繁地被IO阻塞,被阻塞的進程為了不占用CPU,會調用io_schedule_timeout或io_schedule來掛起自己,直到IO完成。

這種等待是D狀態的,一旦超過了120S,就會觸發hungtask。當然,這是非常極端的情況,IO已經完全沒救的情況。

大部分時候,IO雖然打滿了,但是總能周轉過來,所以這些進程并不會等太久。

然而,這些進程若是來自同一個業務,則大概率會訪問同一個數據,這就需要通過mutex、rwsem、semaphore等同步機制來控制訪問行為。

而這些同步機制的基本接口都是uninterruptible性質的,以semaphore為例:

extern void down(struct semaphore *sem); // 基本接口。獲取信號量,獲取不到則進入uninterruptible睡眠
extern int __must_check down_interruptible(struct semaphore *sem); // 其他接口
extern int __must_check down_killable(struct semaphore *sem); // 其他接口
extern int __must_check down_trylock(struct semaphore *sem); // 其他接口
extern int __must_check down_timeout(struct semaphore *sem, long jiffies); // 其他接口

所謂uninterruptible性質,即當進程獲取不到同步資源時,直接進入D狀態等待其他進程釋放資源。

其他同步資源,rwsem、mutex等,都有這樣的uninterruptible性質接口。

正常情況下,只要持有同步資源的進程正常運行不卡頓,那么即使有上百個進程來爭搶這些同步資源,對于排序靠后的進程來說,時間也是夠的,一般不會等待超過120s。

但在低內存情況下,大家都在等IO,這些持有資源的進程也不能幸免,引發堵車連鎖反應。

如果此時同步資源的waiter們已累計了幾十個甚至上百個,那么就算只有一瞬間的io卡頓,排序靠后的waiter也容易等待超過120s,觸發hungtask。

一個非常典型的案例,一臺CVM在連續報了幾條hungtask warning后,徹底無響應了,通過魔術建觸發重啟。

系統信息如下:

內存狀況不容樂觀,典型的低內存:

log上有很多hungtask warning,超時原因都是等rwsem太長,寫者waiter和讀者waiter都有:

這些進程在等同一個rwsem,這個rwsem的地址為:ffff880e9703f370

進一步探究,發現當前對ffff880e9703f370有引用的進程為19個,11個正在讀,8個排隊。

而這11個正在讀的進程,都在做同一件事——direct reclaim,并且都卡在IO等待:

這11個進程,雖然也是D狀態,但由于時不時能調度到IO,相當于D狀態的持續時間不斷重置,所以本身并沒有觸發hungtask。

而這8個waiter進程就沒這個好運了,被前面11個進程你方唱罷我登場地阻塞,持續時間也沒有機會重置,最終超過120s,引發hungtask了。

優化低內存處理

我們已經知道了低內存會導致IO突增,甚至導致hungtask,那要如何避免呢?

可以從兩方面來避免。

(1) 調整臟頁回刷頻率

將平時的臟頁回刷頻率調高,這樣內存回收時,需要回收的臟頁就更少,降低IO的增量。

  • 調低 /proc/sys/vm/dirty_writeback_centisecs
  • 調低/proc/sys/vm/dirty_background_ratio
(2) 調高low水線和min水線

調高水線,可以更早地進入內存回收邏輯,這樣可以將free維持在一個較高水平,避免陷入極端場景。由于low和min同時受min_free_kbytes管控,所以可以直接調整min_free_kbytes值。

調高/proc/sys/vm/min_free_kbytes

責任編輯:趙寧寧 來源: 騰訊技術工程
相關推薦

2023-08-26 07:44:13

系統內存虛擬

2021-03-10 10:40:04

Redis命令Linux

2020-12-10 07:37:42

HashMap數據覆蓋

2021-12-27 08:24:08

漏洞網絡安全

2021-08-19 17:27:41

IT數據中心災難

2023-06-27 16:53:50

2015-09-25 10:41:48

r語言

2011-10-11 15:42:54

大數據數據庫

2020-12-16 19:26:42

IIOTIOT工業物聯網

2012-12-25 15:19:20

Windows操作系統

2019-03-14 11:00:40

GoLua語言

2020-06-15 08:06:25

ES數據

2016-01-04 11:03:00

2015-11-19 00:11:12

2023-04-27 07:40:08

Spring框架OpenAI

2025-11-18 07:00:00

AI戰略自動化自主式AI

2024-01-18 11:50:28

2019-02-27 10:18:26

重置Windows 10Windows

2015-04-16 10:40:29

2021-01-06 16:19:02

物聯網安全人工智能
點贊
收藏

51CTO技術棧公眾號

久久爱另类一区二区小说| 99tv成人影院| 日韩电影在线一区二区三区| xxx成人少妇69| 男女视频在线观看| 久久久久久**毛片大全| 久久久人人爽| 日韩欧美在线精品| 亚洲免费视频一区二区| 在线亚洲精品福利网址导航| 午夜av在线免费观看| 伊人久久综合一区二区| 亚洲人成精品久久久| 欧美国产日韩中文字幕在线| 国产精品免费av| 日韩一级特黄| www.男人的天堂.com| 亚洲第一男人av| 日韩在线a电影| 日韩欧美一区三区| 好看的亚洲午夜视频在线| 国产精品精品久久久| 色橹橹欧美在线观看视频高清| 久久精品视频免费播放| 丰满大乳少妇在线观看网站| 久久综合色天天久久综合图片| 国产视频在线视频| 日韩精品亚洲视频| 国产亚洲精aa在线看| 韩日精品视频一区| av777777| 亚洲成人中文在线| 1024精品视频| 色婷婷av一区二区三区大白胸| 成人免费视频| 日韩风俗一区 二区| 97欧美在线视频| 99在线视频首页| 综合另类专区| 日韩精品小视频| 成人午夜一级| 国产日韩欧美在线观看| 黑人极品ⅴideos精品欧美棵| 欧美精品v日韩精品v韩国精品v| 欧美激情在线免费| 熟女少妇精品一区二区| 国产精品视频九色porn| 黄色仓库视频网站| 亚洲毛片在线观看| 成人羞羞视频免费看看| 久久精品99国产精品酒店日本| 久久国产精品黑丝| 午夜精品久久久久久久99樱桃| 欧美jizzhd欧美| 久久91亚洲人成电影网站| 久久91在线| 韩国精品美女www爽爽爽视频| 天堂成人免费av电影一区| 色总=综合色| 久久精品视频导航| 每日更新成人在线视频| 久久国产精品网站| 91社区在线| 日韩欧美色综合| 国产精品av一区二区三区| 亚洲人成网在线播放| 欧美ab在线视频| av高清在线| 久久天天躁狠狠躁夜夜爽蜜月| 一区二区中文| 97福利电影| 日韩欧美一二三区| 午夜欧美视频| 18av在线视频| 欧美最大成人综合网| 91丨九色丨蝌蚪丨老版| 国产福利电影在线播放| 国产 欧美 日韩 一区| 日韩在线视频二区| 欧美最猛性xxxxx直播| 国产农村妇女精品一区二区| mm1313亚洲国产精品无码试看| 一区二区三区美女| 98视频精品全部国产| 黄色大片在线免费看| 亚洲成av人片一区二区梦乃| 午夜av在线播放| 国产精品美女999| 久久久人成影片一区二区三区观看 | 91视频-88av| 97精品国产| 国内高清免费在线视频| 精品欧美一区二区在线观看视频| 91电影在线观看| 久久精品亚洲精品国产欧美| 久久免费电影| 日韩av片免费在线观看| 久久日一线二线三线suv| 一区二区三区高清在线观看| 免费在线激情视频| 国产精品久久三区| 国产精品一 二 三| 中文av字幕一区| 欧美精品尤物在线观看| 日本在线免费观看视频| 日韩免费一级视频| 亚洲精品乱码久久久久久久久| 国产欧美日韩| 精品资源在线看| 国产亚洲综合视频| 亚洲欧美综合另类中字| 日韩一区二区三区电影在线观看| 91福利视频在线| 亚洲欧美在线aaa| 依依成人综合视频| 日韩激情一二三区| 国产盗摄——sm在线视频| 97人人干人人| 欧美午夜寂寞影院| 久久亚洲精精品中文字幕早川悠里 | 国产精品日韩欧美一区二区| 中文字幕一区二区在线播放| 在线精品亚洲| 色8久久久久| 欧美新色视频| 黄色www网站| 黄色一级片av| 久精品国产欧美| 国产一区二区激情| 国产成人精品影视| 蜜桃a∨噜噜一区二区三区| 中文字幕天天干| 黄色动漫网站入口| 欧美激情第六页| 一本色道久久88亚洲综合88| 精品一区二区在线看| 欧美伊人亚洲伊人色综合动图| 欧美中日韩一区二区三区| 亚洲国产日韩欧美在线动漫| 欧美成人video| 久久精品国产精品亚洲红杏| 国产欧美大片| 日韩精品福利一区二区三区| 欧美啪啪免费视频| 国产69精品久久久久9999| 99久久伊人久久99| 国产精品免费精品自在线观看| 妞干网视频在线观看| 亚洲色图第三页| 国产精品国产三级国产aⅴ原创| 国产精品videossex| 国精产品一区二区三区有限公司| 欧美××××黑人××性爽| 50度灰在线| 永久免费在线看片视频| 在线观看久久久久久| 日本91av在线播放| 欧美另类69精品久久久久9999| 日本久久精品电影| 国产亚洲欧美一级| 国产亚洲视频系列| 亚洲va欧美va人人爽| 国产乱淫av一区二区三区| 国产亚洲福利| 日本va欧美va精品| 综合激情成人伊人| 亚洲成人网久久久| 亚洲成人综合在线| 色系网站成人免费| 91夜夜未满十八勿入爽爽影院| 亚洲精品国产欧美| 色系列之999| 91香蕉亚洲精品| 国产精品流白浆视频| 国产精品视频26uuu| 成人欧美在线视频| 亚洲老头老太hd| 欧美日韩成人综合| 亚洲国产精品成人综合| 久激情内射婷内射蜜桃| 国产成人精彩在线视频九色| 亚洲奶大毛多的老太婆| 91精品综合久久久久久| 国产精品久久久爽爽爽麻豆色哟哟| 国产精品一区二区免费不卡| 粉嫩高潮美女一区二区三区 | 自拍视频亚洲| 九九在线精品视频| 伊人夜夜躁av伊人久久| 欧美一级欧美三级在线观看| 尤物九九久久国产精品的分类| 日本成人精品在线| 国产免费色视频| 人人做人人爽| 毛片网站在线看| 久久精品亚洲人成影院| 国产成人av电影免费在线观看| 91黄视频在线观看| 欧美成人激情图片网| 免费观看国产视频在线|