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, 感谢原作者分享。

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Um den Linux-Kernel auf Ubuntu22.04 zu installieren, können Sie die folgenden Schritte ausführen: Aktualisieren Sie das System: Stellen Sie zunächst sicher, dass Ihr Ubuntu-System auf dem neuesten Stand ist. Führen Sie den folgenden Befehl aus, um das Systempaket zu aktualisieren: sudoaptupdatesudoaptupgrade Laden Sie die Kerneldatei herunter: Besuchen Sie die Offizielle Linux-Kernel-Website () zum Herunterladen der erforderlichen Kernel-Version. Wählen Sie eine stabile Version und laden Sie die Quellcodedatei herunter (mit der Erweiterung .tar.gz oder .tar.xz), zum Beispiel: wget Entpacken Sie die Datei: Verwenden Sie den folgenden Befehl, um die heruntergeladene Kernel-Quellcodedatei zu entpacken: tar-xflinux-5.14 .tar. xz install build dependencies: Installieren Sie die zum Erstellen des Kernels erforderlichen Tools und Abhängigkeiten. Ausführen

Ändern Sie die Kernel-Startsequenz von Linux 1. Ändern Sie die Kernel-Startsequenz von RHEL6/CentOS6. Überprüfen Sie die Datei /etc/grub.conf, um die Systemkernel-Situation zu ermitteln. Dem Dokument zufolge gibt es im System zwei Kernel-Versionen, nämlich 2.6.32-573.18.1.el6.x86_64 und 2.6.32-431.23.3.el6.x86_64. Die Kernel-Versionen werden von oben nach unten aufgelistet. In der Datei grub.conf können Sie durch Anpassen der Standardparameter entscheiden, welche Kernel-Version beim Systemstart verwendet werden soll. Der Standardwert ist 0, was bedeutet, dass das System die neueste Kernel-Version startet. Ein Wert von 0 entspricht dem ersten Inhalt, der in der Datei grub.conf aufgeführt ist.

OOM bedeutet, dass im Programm eine Sicherheitslücke vorliegt, die durch den Code oder die JVM-Parameterkonfiguration verursacht werden kann. In diesem Artikel erfahren die Leser, wie sie Fehler beheben können, wenn ein Java-Prozess OOM auslöst.

Snapdragon-Prozessoren genießen seit jeher große Anerkennung für ihre hervorragende Leistung und stabile Leistung und gehören zu den bevorzugten Prozessoren für mobile Geräte wie Mobiltelefone und Tablets. Mit der kontinuierlichen Weiterentwicklung der Technologie werden auch die Snapdragon-Prozessoren ständig aktualisiert und jede neue Produktgeneration wird große Aufmerksamkeit erregen. Kürzlich hat eine renommierte Organisation die neueste Rangliste der Snapdragon-Prozessoren veröffentlicht, die den Menschen ein klareres Verständnis der Leistung jedes Prozessors vermittelt. Zunächst einmal gehören laut Liste die Prozessoren der Snapdragon 8-Serie seit jeher zu den leistungsstärksten Prozessoren und sind auf dem Markt sehr gefragt. Neueste Ausgabe

Man kann sagen, dass OOM eines der Probleme ist, die wir Entwickler am meisten fürchten, und die Ursachen liegen im Wesentlichen in der Code- oder JVM-Parameterkonfiguration. In diesem Artikel erfahren die Leser, wie sie Fehler beheben können, wenn ein Java-Prozess OOM auslöst.

Basiert das Android-System auf dem Linux-Kernel? Das Android-System, eines der am weitesten verbreiteten mobilen Betriebssysteme der Welt, soll seit jeher auf Basis des Linux-Kernels entwickelt werden. Doch wie ist die reale Situation? Lassen Sie uns dieses Problem untersuchen. Lassen Sie uns zunächst etwas über den Linux-Kernel lernen. Der Linux-Kernel als Open-Source-Betriebssystemkernel wurde erstmals 1991 von Linus Torvalds veröffentlicht. Es bietet eine gute Grundlage für viele Betriebssysteme, einschließlich And

Analyse und Analyse der Hauptfunktionen des Linux-Kernels Der Linux-Kernel ist ein großes und komplexes System, in dem die Hauptfunktion eine wichtige Rolle spielt. Sie ist der Einstiegspunkt des gesamten Systems und schließlich für die Initialisierung verschiedener Subsysteme, Treiber und Kernelmodule verantwortlich Starten Sie das gesamte Betriebssystem. In diesem Artikel werden die Hauptfunktionen des Linux-Kernels analysiert und analysiert und seine Schlüsselfunktionen und der Ausführungsablauf anhand spezifischer Codebeispiele demonstriert. Im Linux-Kernel ist der Einstiegspunkt der Hauptfunktion start_k in der Datei init/main.c.

Titel: Erkundung der Programmiersprache, die dem Linux-Kernel zugrunde liegt. Als stabiler und zuverlässiger Open-Source-Betriebssystemkern bietet der Linux-Kernel ein breites Anwendungsspektrum im Computerbereich. Um ein tiefgreifendes Verständnis des Linux-Kernels zu erlangen, müssen Sie die auf der zugrunde liegenden Ebene verwendete Programmiersprache einbeziehen. Tatsächlich ist der Linux-Kernel hauptsächlich in der Sprache C geschrieben, einer effizienten, flexiblen und einfach zu wartenden Programmiersprache, die sich sehr gut für die Betriebssystementwicklung eignet. In diesem Artikel werden die Grundlagen des Linux-Kernels aus einer detaillierten Perspektive untersucht
