web-dev-qa-db-fra.com

Comment trouver ce qui utilise Swap Linux ou ce qui est dans l'échange?

Je serveur linux virtuel (Fedora 17) avec 28GB RAM et d'échange de 2 Go. Le serveur exécute un DB MySQL qui est configuré pour utiliser la plupart de la RAM.

Après un certain temps de fonctionnement du serveur commence à utiliser swap pour échanger les pages unsued. C'est bien que mon swappiness est à défaut 60 et il est le comportement attendu.

La chose étrange est que le nombre en haut/meminfo ne correspond pas avec les informations de processus. C'est à dire. le serveur rapporte ces numéros:

/proc/meminfo:
SwapCached:        24588 kB
SwapTotal:       2097148 kB
SwapFree:         865912 kB

top:
Mem:  28189800k total, 27583776k used,   606024k free,   163452k buffers
Swap:  2097148k total,  1231512k used,   865636k free,  6554356k cached

Si j'utilise le script à partir https://serverfault.com/a/423603/98204 il signale un nombre raisonnable (quelques mégaoctets par permutées bash'es, systemd, etc.) et une grande allocation de MySQL ( J'omis beaucoup de lignes de sortie):

892        [2442] qmgr -l -t fifo -u
896        [2412] /usr/libexec/postfix/master
904        [28382] mysql -u root
976        [27559] -bash
984        [27637] -bash
992        [27931] SCREEN
1000       [27932] /bin/bash
1192       [27558] sshd: admin@pts/0
1196       [27556] sshd: admin [priv]
1244       [1] /usr/lib/systemd/systemd
9444       [26626] /usr/bin/Perl /bin/innotop
413852     [31039] /usr/libexec/mysqld --basedir=/usr --datadir=/data/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/data/mysql/err --open-files-limit=8192 --pid-file=/data/mysql/pid --socket=/data/mysql/mysql.sock --port=3306
449264   Total Swap Used

Donc, si je reçois la sortie du script droit l'utilisation du swap total devrait être 449264K = ca. 440MB avec MySQL avec ca. 90% de l'échange.

La question est pourquoi cela diffère tant par le haut et le nombre meminfo? Est-il possible comment les informations d'échange " dump " pour voir ce qui est réellement en elle au lieu de sommer les usages d'échange de tous les processus?

Lors de l'analyse de la question, je suis venu avec des idées différentes mais tout semble se tromper:

  1. La sortie de script n'est pas en Ko. Même si elle serait en 512 ou 4Ko unités, il ne correspondra pas à. En fait, le rapport (1200: 440) est d'environ 3: 1 qui est le nombre " étrange ".
  2. Il y a quelques pages en échange qui sont en quelque sorte partagé entre les processus comme mentionné dans https://serverfault.com/a/477664/98204 . Si cela est vrai, comment puis-je trouver le nombre réel de mémoire utilisée comme celui-ci? Je veux dire qu'il aurait besoin de faire la différence cca 800MB. Et cela ne semble pas juste dans ce scénario.
  3. Il y a quelques pages " anciennes " échange utilisés par les processus qui ont déjà terminé. Je ne me dérangerait pas que si je pouvais savoir combien est ce swap " libérables ".
  4. Il y a des pages en échange qui a été raffraîchissement à la mémoire et sont en échange au cas où ils n'ont pas changé RAM et doivent être permutés à nouveau comme mentionné dans https: //serverfault.com/a/100636/98204 . Mais la valeur SwapCached est seulement 24MB.

La chose étrange est que l'utilisation du swap augmente lentement tandis que la sortie de somme à partir du script est à peu près la même chose. Dans les 3 derniers jours, l'échange utilisée est passé de 1100MB à 1230MB courant tandis que la somme est passée de 430MB à 449MB actuelle (environ).

Le serveur a suffisamment libre (pouvoir) RAM donc je pouvais désactiver le swap et rallumez-le. Ou je pourrais swappiness probablement mis à 0 pour l'échange ne s'utilisé que si le est aucune autre manière. Mais je voudrais résoudre le problème ou tout au moins savoir quelle est la cause de cela.

12
Radek Hladík

Fedora 18 et plus ont smem dans les repos. Vous pouvez télécharger le python script et installer à partir de source .

Voici une sortie d'échantillon (un peu coupée et anonymisée) de ma machine:

# smem -s swap -t -k -n
  PID User     Command                         Swap      USS      PSS      RSS 
20917 1001     bash                               0     1.1M     1.1M     1.9M 
28329 0        python /bin/smem -s swap -t        0     6.3M     6.5M     7.4M 
 2719 1001     gnome-pty-helper               16.0K    72.0K    73.0K   516.0K 
  619 0        @sbin/mdadm --monitor --sca    28.0K    72.0K    73.0K   248.0K 

[big snip]

32079 42       gnome-Shell --mode=gdm         41.9M     1.9M     2.0M     5.0M 
32403 1001     /opt/google/chrome/chrome -    43.1M   118.5M   119.4M   132.3M 
 4844 1002     /opt/google/chrome/chrome      48.1M    38.1M    41.9M    51.9M 
 5411 1002     /opt/google/chrome/chrome -    54.6M    33.4M    33.5M    36.8M 
 5624 1002     /opt/google/chrome/chrome -    72.4M    54.9M    55.5M    65.7M 
24328 1002     /opt/Adobe/Reader9/Reader/i    77.5M     1.9M     2.0M     5.2M 
 4921 1002     /opt/google/chrome/chrome -   147.2M   258.4M   259.4M   272.0M 
-------------------------------------------------------------------------------
  214 14                                       1.1G     1.1G     1.2G     1.7G 

La source fournit également smemcap qui stockera toutes les données pertinentes afin que SMEM puisse être exécuté dessus ultérieurement.

   To  capture  memory statistics on resource-constrained systems, the the
   smem source includes a utility named  smemcap.   smemcap  captures  all
   /proc entries required by smem and outputs them as an uncompressed .tar
   file to STDOUT.  smem can analyze the output using the --source option.
   smemcap is small and does not require Python.
9
rickhg12hs