Først skal vi lige have nogle begreber på plads (simplificerede forklaringer):
- page: en sammenhængende blok af hukommelse på (oftest) 4 KB (=4096 bytes). Der er pages i fysisk RAM, swap, og så virtuel hukommelse.
Virtuel hukommelse består af hukommelse fra fysisk RAM og swap + en liste af pages inde i kernen. - copy-on-write: Når mere end 1 program (processer) eller 1 library deler den samme page, og den page er markeret copy-on-write, så laver kernen en kopi af en page, hvis et program begynder at skrive til den page. Når kernen er færdig med at kopiere har de 2 programmer en forskellig page, som indeholder indholdet af den page de før delte. Derefter gentager kernen maskinkodeinstruktionen for det program der ville skrive til copy-on-write pagen, og denne gang lykkedes skrivningen så for programmet, da den skriver til sin egen page.
Linux KSM memory deduplikering betyder at kernen kan finde 2 ens (som i nøjagtig ens) pages.
Kernen laver så 2 ændringer i sin liste over pages:
- Den lader den ene af de 2 pages pege på den anden page, og markerer den nu delte page for en copy-on-write page.
- Den lader den anden page markeres som fri hukommelse
Det betyder at hvis kernen kan finde - lad os sige - 1025 ens pages vil det resultere i at 1024 pages bliver til fri hukomelse (det er 4 MB, hvis 1 page= 4KB), og at den ene page vil så blive delt 1025 gange.
(ekstrem sammenligning, men det fremmer måske forståelsen).
Læs mere:
- https://en.wikipedia.org/wiki/Kernel_same-page_merging
- https://insights.ubuntu.com/2015/05/18/lxd-crushes-kvm-in-density-and-speed
- http://www.iron.io/blog/2013/03/how-we-went-from-30-servers-to-2-go.html
/Lars