Ich antworte auf den Linux- Tag. Meine Antwort bezieht sich nur auf Linux .
Ja, große Seiten sind anfälliger für Fragmentierung. Es gibt zwei Speicheransichten: die, die Ihr Prozess erhält (virtuell) und die, die der Kernel verwaltet (real). Je größer eine Seite ist, desto schwieriger wird es, ihre Nachbarn zu gruppieren (und bei ihnen zu bleiben), insbesondere wenn Ihr Dienst auf einem System ausgeführt wird, das auch andere unterstützen muss, die standardmäßig viel mehr Speicher zuweisen und schreiben als sie tatsächlich am Ende mit.
Die Zuordnung des Kernels zu (echten) zugewiesenen Adressen ist privat. Es gibt einen sehr guten Grund, warum Userspace sie so sieht, wie der Kernel sie präsentiert, weil der Kernel in der Lage sein muss, ein Overcommit durchzuführen, ohne Userspace zu verwirren. Ihr Prozess wird einen schönen, zusammenhängenden „Disneyfied“ Adressraum , in dem zu arbeiten, nicht bewusst, was der Kern tatsächlich tut hinter den Kulissen mit diesem Speicher.
Der Grund , warum Sie verminderte Leistung sehen auf lange laufenden Server ist sehr wahrscheinlich , weil zugeordnete Blöcke, die nicht explizit gesperrt (zB mlock()
/ mlockall()
oder posix_madvise()
) und eine Zeit lang nicht verändert wurden ausgelagert , was bedeutet , dass Sie da Kufen auf der Festplatte , wenn es zum Lesen Sie. Wenn Sie dieses Verhalten ändern, wird Ihr Prozess zu einem schlechten Nachbarn . Aus diesem Grund stellen viele Benutzer ihr RDBMS auf einen völlig anderen Server als web / php / python / ruby / whatever. Die einzige Möglichkeit, dies zu beheben, besteht darin, die Konkurrenz um zusammenhängende Blöcke zu verringern.
Fragmentierung ist (in den meisten Fällen) nur dann wirklich bemerkbar, wenn sich Seite A im Speicher befindet und Seite B zum Auswechseln verschoben wurde. Ein Neustart Ihres Dienstes scheint dies natürlich zu "heilen", aber nur, weil der Kernel noch keine Gelegenheit hatte, den Prozess "(jetzt) neu zugewiesene Blöcke im Rahmen seiner Überlastungsquote" auszublenden.
Tatsächlich wird ein Neustart (sagen wir mal) von 'Apache' unter hoher Last wahrscheinlich Blöcke, die anderen Diensten gehören, direkt auf die Festplatte senden. Also ja, 'Apache' würde sich für kurze Zeit verbessern, aber 'MySQL' könnte darunter leiden. Zumindest bis der Kernel sie gleichermaßen leiden lässt, wenn es einfach an genügend physischem Speicher mangelt.
Fügen Sie mehr Speicher hinzu oder teilen Sie anspruchsvolle malloc()
Verbraucher auf :) Es ist nicht nur eine Fragmentierung, die Sie sich ansehen müssen.
Versuchen Sie vmstat
sich einen Überblick darüber zu verschaffen, was wo tatsächlich gespeichert wird.