Linux swap'ı neyin kullandığını veya swapta neleri nasıl bulabilirim?


12

28GB RAM ve 2GB takas özellikli sanal linux (Fedora 17) sunucum var. Sunucu, RAM'in çoğunu kullanacak şekilde ayarlanmış bir MySQL DB çalıştırıyor.

Bir süre çalıştıktan sonra sunucu, yayınlanmamış sayfaları değiştirmek için takas kullanmaya başlar. Swappiness varsayılan olarak 60 ve beklenen davranış bu iyi.

Garip olan şey, top / meminfo'daki sayının işlemlerden gelen bilgilerle uyuşmamasıdır. Yani sunucu şu numaraları bildiriyor:

/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

Https://serverfault.com/a/423603/98204 adresinden komut dosyasını kullanırsam makul sayıları (bash'es, systemd, vb. İle değiştirilen birkaç MB) ve MySQL'den büyük bir ayırma rapor eder (çok sayıda çıkış satırını atladım) ):

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

Komut dosyası çıktısını doğru alırsam toplam takas kullanımı 449264K = ca olmalıdır. Ca kullanarak mysql ile 440MB. Takasın% 90'ı.

Soru, bunun neden üst ve meminfo sayılarından çok farklı olduğudur? Tüm işlemlerden takas kullanımlarını toplamak yerine, gerçekte ne olduğunu görmek için takas bilgilerinin nasıl "dökülmesinin" bir yolu var mı?

Sorunu analiz ederken farklı fikirler buldum ama hepsi yanlış görünüyor:

  1. Komut dosyası çıktısı KB cinsinden değil. 512 veya 4KB birimlerde olsa bile eşleşmez. Aslında oran (1200: 440) "garip" sayı olan yaklaşık 3: 1'dir.
  2. Https://serverfault.com/a/477664/98204'te belirtildiği gibi takasta bazı işlemler arasında paylaşılan bazı sayfalar var . Bu doğruysa, bu şekilde kullanılan gerçek bellek sayısını nasıl bulabilirim? Yani cca 800MB fark yaratması gerekecek. Ve bu senaryoda bu doğru gelmiyor.
  3. Takasta zaten bitmiş işlemler tarafından kullanılan bazı "eski" sayfalar vardır. Bu "serbest" takasın ne kadar olduğunu öğrenebilseydim.
  4. Takasta, belleğe geri takılan ve RAM'de değişmemesi ve /server//a/100636/98204'te belirtildiği gibi tekrar takas edilmesi gerektiğinde takas edilen sayfalar vardır . Ancak SwapCached değeri yalnızca 24 MB'dir.

Garip olan şey, betiğin toplam çıktısı kabaca aynı iken takas kullanımının yavaşça artmasıdır. Son 3 günde kullanılan takas, 1100MB'den 1230MB'a yükselirken, toplam 430MB'den 449MB'ye (yaklaşık) yükseldi.

Sunucunun yeterli boş (mümkün) RAM'i var, bu yüzden sadece takas kapatıp tekrar açabiliyorum. Veya swapiness'i 0 olarak ayarlayabilirim, böylece takas sadece başka bir yol olmadığında kullanılır. Ancak sorunu çözmek veya en azından bunun nedeninin ne olduğunu öğrenmek istiyorum.


Dediğiniz gibi vm.swappiness = 0 (veya 1) ayarlamanız ve && swapon takas etmeniz gerekir
HTTP500

Ancak bu sorunu çözmez. Swappines'i 60'a geri ayarlarsam veya 0 veya 1'de
tutarsam

Bir DB Sunucusuysa, her zaman 0 (veya 1) olarak ayarlamanız gerekir.
HTTP500

Bu doğru ve muhtemelen bu sorunun nedenini bulamazsam ne yapacağım ... Öte yandan sunucu üzerinde çok seyrek kullanılan çok sayıda küçük DB var ve ben olma fikrini sevdim Kullanılmadığı zaman sistem tarafından değiştirildi ... Ancak MySQL'in kendi başına halledebileceğini düşünüyorum ...
Radek Hladík

Mysql, kendi önbelleklerini yönetme konusunda oldukça iyi bir iş çıkarır, ancak bu aslında bellekte neyin var olup olmadığına dair varsayımlara dayanır. Takas belleği kullanarak bunu iki kere tahmin etmeye çalışırsanız, mysql'in neyin önbelleğe alınması ve neyin önlenmeyeceğine karar verme yeteneğini bozarsınız. Değiştirmeyi kapatın. Eğer takas vurursanız, bu bir ayarlama hatası. Önbellek boyutlarınızı, takas asla olmayacak şekilde ayarlayın, ancak kısaca, kullanılabilir tüm fiziksel belleği kullanmak istersiniz.
mc0e

Yanıtlar:


9

smemDepolarda Fedora 18 ve üstü var . Python betiğini indirebilir ve kaynaktan yükleyebilirsiniz .

İşte makinemden bir örnek çıktı (biraz kesilmiş ve anonimleştirilmiş):

# 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 

Kaynak ayrıca, ilgili smemcaptüm verilerin depolanmasını sağlar , böylece daha sonra smem çalıştırılabilir.

   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.

1
F17 repo SMEM eser (boş bir liste gösterdi) yoktu ama kaynağından biri çalıştı ve çok başarılı şov kullanılan 1191224k ederken, diğerleri :-) 392.6M toplam dışına MySQL 358.1M hemen hemen aynı sayıları görünüyor
Radek Hladík

4

Sistemim doğru takas kullanımını gösterdiğinden, bu komut dosyasını başka bir makinede kontrol etmelisiniz:

# Your_script.sh
111280   Total Swap Used
# free
Swap:     33551716     120368   33431348

Çok yakın 111280 ~ = 120368.

Ayrıca, şu komut dosyasına bakın:

proc in / proc / * için; do cat $ proc / smaps 2> / dev / null | awk '/ Swap / {swap + = $ 2} END {print swap "\ t' readlink $proc/exe'"}'; bitti | sıralama -n | awk '{toplam + = 1 $} / [0-9] /; END {toplam yazdır "\ tToplam"}'

Bu konudan:

/unix/71714/linux-total-swap-used-swap-used-by-processes


Bahsedilen senaryo aynı sonuçları döndürüyor ... 364920 / usr / libexec / mysqld 400372 Toplam
Radek Hladík

Komut dosyasını çok düşük takas kullanımı (50MB) olan diğer sunucuda denediğimde toplamda 72MB cca bildirdi :-) Daha sonra bazı üretim dışı sunucularda simüle etmem gerekecek ...
Radek Hladík
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.