vm.swappiness=0在最新内核中可能会OOM,MySQL被意外kill
请使用RHEL/CentOS 6.4及更新版本内核的MySQL同志们注意,vm.swappiness = 0的默认行为修改了,如果继续设置vm.swappiness = 0,有可能导致系统内存溢出,从而导致MySQL被意外kill掉。 在之前的《LINUX上MYSQL优化三板斧》中,我们建议大家把 vm.swappiness
请使用RHEL/CentOS 6.4及更新版本内核的MySQL同志们注意,vm.swappiness = 0的默认行为修改了,如果继续设置vm.swappiness = 0,有可能导致系统内存溢出,从而导致MySQL被意外kill掉。
在之前的《LINUX上MYSQL优化三板斧》中,我们建议大家把 vm.swappiness = 0 设置好。来尽量避免MySQL的服务器内存被交换出去。这样Linux在把内存交换出去时更偏向于将cache页交换出去,而不是将inactive页交换出去。详细描述请参考:http://www.woqutech.com/?p=1200。
经常有人会问, vm.swappiness = 0会不会导致Linux在有swap空间的时候也不交换出去,从而导致内存溢出(OOM)。参照《LINUX上MYSQL优化三板斧》介绍,我们知道,这个值只是一个Linux在判断是否交换内存(swap)的一个“倾向”参考值,而并不是说,设置为0以后,Linux就完全不会使用内存交换空间。
但是,在较新的内核中(2.6.32-303.el6及以后),vm.swappiness = 0 的默认行为修改掉了,这个说法不再成立。设置该参数vm.swappiess=0,有可能导致MySQL数据库所在的系统出现内存溢出。一般来说,MySQL数据库占用的内存是整个服务器中最大的,根据Linux的策略,它会会首先把MySQL给Kill掉(调整?/proc/(pidof -s mysqld)/oom_adj可以改变OOM时kill的优先级),从而导致应用故障等。
这个修改是在内核3.5-rc1中提交的,并且合并到了2.6.32-303.el6及之后的各个版本。先让我们来看看这个patch:
http://gitorious.ti.com/ti-linux-kernel/ti-linux-kernel/commit/fe35004fbf9eaf67482b074a2e032abb9c89b1dd?format=patch
From fe35004fbf9eaf67482b074a2e032abb9c89b1dd Mon Sep 17 00:00:00 2001
From: Satoru Moriya
Date: Tue, 29 May 2012 15:06:47 -0700
Subject: [PATCH] mm: avoid swapping out with swappiness==0
Sometimes we'd like to avoid swapping out anonymous memory. ?In
particular, avoid swapping out pages of important process or process
groups while there is a reasonable amount of pagecache on RAM so that we
can satisfy our customers' requirements.
OTOH, we can control how aggressive the kernel will swap memory pages with
/proc/sys/vm/swappiness for global and
/sys/fs/cgroup/memory/memory.swappiness for each memcg.
But with current reclaim implementation, the kernel may swap out even if
we set swappiness=0 and there is pagecache in RAM.
This patch changes the behavior with swappiness==0. ?If we set
swappiness==0, the kernel does not swap out completely (for global reclaim
until the amount of free pages and filebacked pages in a zone has been
reduced to something very very small (nr_free + nr_filebacked
watermark)).
Signed-off-by: Satoru Moriya
Acked-by: Minchan Kim
Reviewed-by: Rik van Riel
Acked-by: Jerome Marchand
Signed-off-by: Andrew Morton
Signed-off-by: Linus Torvalds
---
?mm/vmscan.c | ? ?6 +++---
?1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 67a4fd4..ee97530 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1761,10 +1761,10 @@ static void get_scan_count(struct mem_cgroup_zone *mz, struct scan_control *sc,
?? * proportional to the fraction of recently scanned pages on
?? * each list that were recently referenced and in active use.
?? */
-?? ap = (anon_prio + 1) * (reclaim_stat->recent_scanned[0] + 1);
+?? ap = anon_prio * (reclaim_stat->recent_scanned[0] + 1);
?? ap /= reclaim_stat->recent_rotated[0] + 1;
-?? fp = (file_prio + 1) * (reclaim_stat->recent_scanned[1] + 1);
+?? fp = file_prio * (reclaim_stat->recent_scanned[1] + 1);
?? fp /= reclaim_stat->recent_rotated[1] + 1;
?? spin_unlock_irq(&mz->zone->lru_lock);
@@ -1777,7 +1777,7 @@ out:
????? unsigned long scan;
????? scan = zone_nr_lru_pages(mz, lru);
-????? if (priority || noswap) {
+????? if (priority || noswap || !vmscan_swappiness(mz, sc)) {
????????? scan >>= priority;
????????? if (!scan && force_scan)
???????????? scan = SWAP_CLUSTER_MAX;
--?
1.7.5
就像Satoru Moriya所说的那样,在之前的版本中,就算我们设置了swappiness=0并且RAM中还有pagecache,内核也可能会交换出部分匿名内存页。而为了“满足用户的需求”,这个patch修改了swappiness=0的行为,如果你设置swappiness=0,那么只有在(nr_free + nr_filebacked
在2.6.32-303.el6 RHEL/CentOS及更新版本的内核中,该patch就已经被合并进来:
* Mon Aug 27 2012 Jarod Wilson
...
- [mm] avoid swapping out with swappiness==0 (Satoru Moriya) [787885]
其他分发版本的Linux(比如Debian,Ubuntu)的版本中,请各位自己查阅一下,看看时候已经合并该patch。
RHEL/CentOS 6.3的内核版本是2.6.32-279,而RHEL/CentOS 6.4的内核为2.6.32-358,从这个版本开始,swappiness的行为就已经修改了,使用这个版本及之后版本的同志们需要特别注意一下。
解决的办法其实也很简单,
1、尽量保证Linux操作系统还有足够的内存
2、最新的内核,建议把vm.swappiness设置1
3、考虑设置 /proc/(pidof -s mysqld)/oom_adj为较小的值来尽量避免MySQL由于内存不足而被关闭。
参考:
https://github.com/torvalds/linux/blob/master/mm/vmscan.c
http://gitorious.ti.com/ti-linux-kernel/ti-linux-kernel/commit/fe35004fbf9eaf67482b074a2e032abb9c89b1dd?format=patch
http://www.mysqlperformanceblog.com/2014/04/28/oom-relation-vm-swappiness0-new-kernel/
原文地址:vm.swappiness=0在最新内核中可能会OOM,MySQL被意外kill, 感谢原作者分享。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在Ubuntu22.04上安裝Linux核心可以按照以下步驟進行操作:更新系統:首先,確保你的Ubuntu系統是最新的,執行以下命令更新系統軟體包:sudoaptupdatesudoaptupgrade下載核心檔案:訪問Linux核心官方網站()下載所需的核心版本。選擇一個穩定版本並下載原始碼檔案(以.tar.gz或.tar.xz為副檔名),例如:wget解壓縮檔:使用下列指令解壓縮下載的核心原始碼檔案:tar-xflinux-5.14.tar. xz安裝建置依賴:安裝建置核心所需的工具和相依性。執

Linux修改核心(kernel)啟動順序一、RHEL6/CentOS6修改核心啟動順序檢視/etc/grub.conf檔案以決定係統核心狀況。根據檔案顯示,系統有兩個核心版本,分別為2.6.32-573.18.1.el6.x86_64和2.6.32-431.23.3.el6.x86_64。核心版本從上到下列出。在grub.conf檔案中,可以透過調整default參數來決定係統啟動時使用哪個核心版本。預設值為0,表示系統將啟動最新的核心版本。值為0對應grub.conf檔案中列出的第一個內

OOM 可以說是我們開發者最害怕的問題之一,導致的原因基本上都是是程式碼或 JVM 參數配置所引起的。這篇文章跟讀者聊聊,Java 進程觸發了 OOM 後如何排查。

OOM 意味著程式存在漏洞,可能是程式碼或 JVM 參數配置引起的。這篇文章跟讀者聊聊,Java 進程觸發了 OOM 後如何排查。

驍龍處理器一直以其出色的性能和穩定的表現贏得了廣泛的認可,是手機和平板電腦等行動裝置的首選處理器之一。隨著科技的不斷發展,驍龍處理器也不斷更新換代,每一代新品都會引起廣泛關注。近日,一家權威機構發布了最新的驍龍處理器排名榜單,讓人們對各款處理器的效能有了更清晰的了解。首先,根據榜單顯示,驍龍8系列處理器一直是效能最強勁的處理器之一,在市場上備受追捧。最新發

安卓系統究竟是不是基於Linux核心?安卓系統作為目前全球使用最廣泛的行動作業系統之一,一直被稱為基於Linux核心開發的。然而,真正的情況究竟如何呢?讓我們來探討一下這個問題。首先,讓我們來了解Linux核心。 Linux內核作為一個開源的作業系統內核,是由LinusTorvalds於1991年首次發布的。它為許多作業系統提供了良好的基礎,包括And

Linux核心主函數解析與分析Linux核心是一個龐大而複雜的系統,其中的主函數起著至關重要的作用,它是整個系統的入口點,負責初始化各種子系統、驅動程式和核心模組,最終啟動整個作業系統。本文將針對Linux核心主函數進行解析與分析,透過具體的程式碼範例來展示其關鍵功能和執行流程。在Linux核心中,主函數的入口點位於init/main.c檔案中的start_k

標題:探究Linux核心底層所使用的程式語言Linux核心作為一個開源、穩定、可靠的作業系統內核,在電腦領域有廣泛的應用。而要深入了解Linux內核,就不得不涉及其底層所使用的程式語言。事實上,Linux核心主要是用C語言編寫的,這是一個高效、靈活且易於維護的程式語言,非常適合用於作業系統的開發。本文將從細節的角度探討Linux內核底
