Vous avez installe Solaris 10 U6. C'est super le zfs boot, non?
Mais apres avoir fait un vmstat (ou peut-etre un top) vous remarquez qu'il n'y a que 200MB de memoire disponible. Pis encore, vous essayez de demarrer la base de donnee Oracle avec une SGA de bonne taille et ca plante, avec une erreur d'assignation de memoire. T'es malade? J'ai 16GB! Qui a vole ma memoire?
# echo "::memstat" | mdb -k
Page Summary Pages MB %Tot
------------ ---------------- ---------------- ----
Kernel 1717128 13415 83%
Anon 238964 1866 12%
Exec and libs 23450 183 1%
Page cache 19039 148 1%
Free (cachelist) 19243 150 1%
Free (freelist) 40453 316 2%
Total 2058277 16080
Physical 2054336 16049
Le kernel utilise 13GB?? Ouaip. Vous avez decouvert l'ARC ZFS. Mais, pas de panique, c'est assez facile a corriger.
Kesaco cet ARC ZFS? Simplement, c'est la memoire que ZFS utilise comme aire de cache. Le mecanisme par defaut c'est que la cache peut utiliser jusqu'a la memoire physique - 1GB. Le probleme c'est que bien que l'ARC peut rapetisser automatiquement quand les applications ont besoin de memoire, en pratique, ca ne se fait pas assez rapidement. En plus, on se retrouve avec de la memoire fragmentee ce qui nous cause un probleme enorme avec la memoire partagee comme SHM (une partie du SGA avec la base de donnee Oracle).
De facon generale, je reserve 2GB pour l'os and mes applications. Si j'utilise Oracle et / ou Sun App server, je mets de cote le SGA et / ou la memoire pour java. On additione le tout. Par exemple, si on a 4GB total que l'on veut mettre de cote et que l'on a 8GB, on ajusterais alors la taille maximum de l'ARC a 4GB.
Vous n'utilisez pas Oracle? Quand meme, si vous utilisez un bureau X ou un serveur Sunray sur votre machine, reservez 2GB, et donc si vous avez 4GB total, ajustez l'ARC a 2GB maximum.
Comment?
editez /etc/system et ajoutez:
* Limitons ZFS ARC a 8GB
set zfs:zfs_arc_max = 8000000000
C'est en fait moins que 8GB, mais c'est plus facile a lire 8 suivi de 9 zeros que 8 x1024x1024x1024. Et donc pour 2GB: 2000000000 et pour 4GB: 4000000000
On doit alors faire un reboot.
Par la suite on pourra verifier que le changement a bel et bien pris:
# kstat -m zfs
module: zfs instance: 0
name: arcstats class: misc
c 8000000000
c_max 8000000000
c_min 1000000000
...