Server Linux hanya menggunakan 60% memori, lalu bertukar

12

Saya punya server Linux yang menjalankan sistem cadangan bacula kami. Mesin itu menggiling seperti orang gila karena akan berat untuk menukar. Masalahnya, itu hanya menggunakan 60% dari memori fisiknya!

Inilah output dari free -m:

free -m
             total       used       free     shared    buffers     cached
Mem:          3949       2356       1593          0          0          1
-/+ buffers/cache:       2354       1595
Swap:         7629       1804       5824

dan beberapa contoh output dari vmstat 1:

procs -----------memory---------- ---swap-- -----io---- -system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  2 1843536 1634512      0   4188   54   13  2524   666    2    1  1  1 89  9  0
 1 11 1845916 1640724      0    388 2700 4816 221880  4879 14409 170721  4  3 63 30  0
 0  9 1846096 1643952      0      0 4956  756 174832   804 12357 159306  3  4 63 30  0
 0 11 1846104 1643532      0      0 4916  540 174320   580 10609 139960  3  4 64 29  0
 0  4 1846084 1640272      0   2336 4080  524 140408   548 9331 118287  3  4 63 30  0
 0  8 1846104 1642096      0   1488 2940  432 102516   457 7023 82230  2  4 65 29  0
 0  5 1846104 1642268      0   1276 3704  452 126520   452 9494 119612  3  5 65 27  0
 3 12 1846104 1641528      0    328 6092  608 187776   636 8269 113059  4  3 64 29  0
 2  2 1846084 1640960      0    724 5948    0 111480     0 7751 116370  4  4 63 29  0
 0  4 1846100 1641484      0    404 4144 1476 125760  1500 10668 105358  2  3 71 25  0
 0 13 1846104 1641932      0      0 5872  828 153808   840 10518 128447  3  4 70 22  0
 0  8 1846096 1639172      0   3164 3556  556 74884   580 5082 65362  2  2 73 23  0
 1  4 1846080 1638676      0    396 4512   28 50928    44 2672 38277  2  2 80 16  0
 0  3 1846080 1628808      0   7132 2636    0 28004     8 1358 14090  0  1 78 20  0
 0  2 1844728 1618552      0  11140 7680    0 12740     8  763 2245  0  0 82 18  0
 0  2 1837764 1532056      0 101504 2952    0 95644    24  802 3817  0  1 87 12  0
 0 11 1842092 1633324      0   4416 1748 10900 143144 11024 6279 134442  3  3 70 24  0
 2  6 1846104 1642756      0      0 4768  468 78752   468 4672 60141  2  2 76 20  0
 1 12 1846104 1640792      0    236 4752  440 140712   464 7614 99593  3  5 58 34  0
 0  3 1846084 1630368      0   6316 5104    0 20336     0 1703 22424  1  1 72 26  0
 2 17 1846104 1638332      0   3168 4080 1720 211960  1744 11977 155886  3  4 65 28  0
 1 10 1846104 1640800      0    132 4488  556 126016   584 8016 106368  3  4 63 29  0
 0 14 1846104 1639740      0   2248 3436  428 114188   452 7030 92418  3  3 59 35  0
 1  6 1846096 1639504      0   1932 5500  436 141412   460 8261 112210  4  4 63 29  0
 0 10 1846104 1640164      0   3052 4028  448 147684   472 7366 109554  4  4 61 30  0
 0 10 1846100 1641040      0   2332 4952  632 147452   664 8767 118384  3  4 63 30  0
 4  8 1846084 1641092      0    664 4948  276 152264   292 6448 98813  5  5 62 28  0

Lebih lanjut, output top yang diurutkan berdasarkan waktu CPU tampaknya mendukung teori bahwa swap adalah apa yang menghambat sistem:

top - 09:05:32 up 37 days, 23:24,  1 user,  load average: 9.75, 8.24, 7.12
Tasks: 173 total,   1 running, 172 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.6%us,  1.4%sy,  0.0%ni, 76.1%id, 20.6%wa,  0.1%hi,  0.2%si,  0.0%st
Mem:   4044632k total,  2405628k used,  1639004k free,        0k buffers
Swap:  7812492k total,  1851852k used,  5960640k free,      436k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+    TIME COMMAND                                                                                                                             
 4174 root      17   0 63156  176   56 S    8  0.0   2138:52  35,38 bacula-fd                                                                                                                            
 4185 root      17   0 63352  284  104 S    6  0.0   1709:25  28,29 bacula-sd                                                                                                                            
  240 root      15   0     0    0    0 D    3  0.0 831:55.19 831:55 kswapd0                                                                                                                              
 2852 root      10  -5     0    0    0 S    1  0.0 126:35.59 126:35 xfsbufd                                                                                                                              
 2849 root      10  -5     0    0    0 S    0  0.0 119:50.94 119:50 xfsbufd                                                                                                                              
 1364 root      10  -5     0    0    0 S    0  0.0 117:05.39 117:05 xfsbufd                                                                                                                              
   21 root      10  -5     0    0    0 S    1  0.0  48:03.44  48:03 events/3                                                                                                                             
 6940 postgres  16   0 43596    8    8 S    0  0.0  46:50.35  46:50 postmaster                                                                                                                           
 1342 root      10  -5     0    0    0 S    0  0.0  23:14.34  23:14 xfsdatad/4                                                                                                                           
 5415 root      17   0 1770m  108   48 S    0  0.0  15:03.74  15:03 bacula-dir                                                                                                                           
   23 root      10  -5     0    0    0 S    0  0.0  13:09.71  13:09 events/5                                                                                                                             
 5604 root      17   0 1216m  500  200 S    0  0.0  12:38.20  12:38 java                                                                                                                                 
 5552 root      16   0 1194m  580  248 S    0  0.0  11:58.00  11:58 java

Berikut ini diurutkan berdasarkan ukuran gambar memori virtual:

top - 09:08:32 up 37 days, 23:27,  1 user,  load average: 8.43, 8.26, 7.32
Tasks: 173 total,   1 running, 172 sleeping,   0 stopped,   0 zombie
Cpu(s):  3.6%us,  3.4%sy,  0.0%ni, 62.2%id, 30.2%wa,  0.2%hi,  0.3%si,  0.0%st
Mem:   4044632k total,  2404212k used,  1640420k free,        0k buffers
Swap:  7812492k total,  1852548k used,  5959944k free,      100k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+    TIME COMMAND                                                                                                                             
 5415 root      17   0 1770m   56   44 S    0  0.0  15:03.78  15:03 bacula-dir                                                                                                                           
 5604 root      17   0 1216m  492  200 S    0  0.0  12:38.30  12:38 java                                                                                                                                 
 5552 root      16   0 1194m  476  200 S    0  0.0  11:58.20  11:58 java                                                                                                                                 
 4598 root      16   0  117m   44   44 S    0  0.0   0:13.37   0:13 eventmond                                                                                                                            
 9614 gdm       16   0 93188    0    0 S    0  0.0   0:00.30   0:00 gdmgreeter                                                                                                                           
 5527 root      17   0 78716    0    0 S    0  0.0   0:00.30   0:00 gdm                                                                                                                                  
 4185 root      17   0 63352  284  104 S   20  0.0   1709:52  28,29 bacula-sd                                                                                                                            
 4174 root      17   0 63156  208   88 S   24  0.0   2139:25  35,39 bacula-fd                                                                                                                            
10849 postgres  18   0 54740  216  108 D    0  0.0   0:31.40   0:31 postmaster                                                                                                                           
 6661 postgres  17   0 49432    0    0 S    0  0.0   0:03.50   0:03 postmaster                                                                                                                           
 5507 root      15   0 47980    0    0 S    0  0.0   0:00.00   0:00 gdm                                                                                                                                  
 6940 postgres  16   0 43596   16   16 S    0  0.0  46:51.39  46:51 postmaster                                                                                                                           
 5304 postgres  16   0 40580  132   88 S    0  0.0   6:21.79   6:21 postmaster                                                                                                                           
 5301 postgres  17   0 40448   24   24 S    0  0.0   0:32.17   0:32 postmaster                                                                                                                           
11280 root      16   0 40288   28   28 S    0  0.0   0:00.11   0:00 sshd                                                                                                                                 
 5534 root      17   0 37580    0    0 S    0  0.0   0:56.18   0:56 X                                                                                                                                    
30870 root      30  15 31668   28   28 S    0  0.0   1:13.38   1:13 snmpd                                                                                                                                
 5305 postgres  17   0 30628   16   16 S    0  0.0   0:11.60   0:11 postmaster                                                                                                                           
27403 postfix   17   0 30248    0    0 S    0  0.0   0:02.76   0:02 qmgr                                                                                                                                 
10815 postfix   15   0 30208   16   16 S    0  0.0   0:00.02   0:00 pickup                                                                                                                               
 5306 postgres  16   0 29760   20   20 S    0  0.0   0:52.89   0:52 postmaster                                                                                                                           
 5302 postgres  17   0 29628   64   32 S    0  0.0   1:00.64   1:00 postmaster

Saya sudah mencoba menyetel swappinessparameter kernel ke nilai tinggi dan rendah, tetapi tampaknya tidak ada yang mengubah perilaku di sini. Saya bingung untuk mencari tahu apa yang terjadi. Bagaimana saya bisa mengetahui apa yang menyebabkan ini?

Pembaruan: Sistem ini adalah sistem 64-bit sepenuhnya, jadi seharusnya tidak ada pertanyaan tentang keterbatasan memori karena masalah 32-bit.

Update2: Seperti yang saya sebutkan dalam pertanyaan awal, saya sudah mencoba menyetel swappiness ke semua jenis nilai, termasuk 0. Hasilnya selalu sama, dengan sekitar 1,6 GB memori yang tersisa tidak digunakan.

Update3: Menambahkan output teratas ke info di atas.

Kamil Kisiel
sumber
2
Tampaknya Linux tidak menggunakan cache halaman untuk apa pun, namun Anda masih memiliki banyak memori bebas. Jelas ada sesuatu yang salah.
David Pashley
1
Bisakah Anda memposting beberapa detail OS Linux tambahan? Vendor, rilis, versi kernel, dll? Ada beberapa alat yang ingin saya sarankan, tetapi beberapa di antaranya memerlukan versi kernel tertentu, atau versi pustaka dukungan.
Christopher Cashell

Jawaban:

6

Kinerja Bacula sangat bergantung pada basis data. Kemungkinan, postgresql yang membunuh server Anda. Rata-rata beban tinggi dan% waktu cpu yang cukup besar yang dihabiskan dalam status tunggu jelas menunjukkan sedang menunggu Disk I / O ... Dan itulah yang dilakukan PostgreSQL. Untuk setiap file di cadangan Anda lakukan paling tidak pernyataan UPDATE. Jangan khawatir tentang pertukarannya.

Setel instal PostgreSQL. Mungkin memberikan basis data individual (atau bahkan tabel) disk / raid set mereka sendiri untuk menyebarkan I / O. Anda dapat memaksa PostgreSQL untuk menggunakan penulisan aynschronous jika belum ... Meskipun itu memperdagangkan integritas basis data untuk kinerja penulisan. Tingkatkan memori bersama yang tersedia untuk PostgreSQL. Itu akan meringankan setidaknya banyak membaca di database. Jika Anda belum pernah melakukannya, jalankan VACCUM ANALYZE pada basis data Bacula juga untuk memberikan sesuatu optimizer query untuk bekerja dengan.

Sejauh ini, titik terlemah Bacula adalah ketergantungan pada basis data (dan sebagian dari otak itu mati ...) Jalankan pembersihan cadangan besar baru-baru ini dan perhatikan berapa lama (berjam-jam) yang diperlukan untuk menjalankan beberapa lusin juta kueri. .. Bacula suka relatif sedikit file besar, kalau tidak itu anjing.

Alexandre Carmel-Veilleux
sumber
Terima kasih. Ini sepertinya inti masalahnya. Kami akan mencari cara untuk memperbaikinya.
Kamil Kisiel
19

Anda terikat I / O. Sistem Anda adalah sebuah rakit kecil, babak belur dalam gelombang buffer / cache / VM paging yang setinggi 100 kaki.

Wow. Cuma wow. Anda bergerak sekitar 100Mbyte / detik dari I / O Anda, Anda sudah melewati 50% waktu CPU dalam I / O tunggu, dan Anda memiliki RAM 4Gb. Tekanan balik pada VM server ini harus sangat besar. Dalam keadaan "normal", ketika sistem mulai buffer / cache, setiap RAM gratis yang Anda miliki akan dimakan hidup-hidup dalam waktu kurang dari 40 detik .

Apakah mungkin untuk memposting pengaturan dari /proc/sys/vm? Ini akan memberikan beberapa wawasan tentang apa yang menurut kernel Anda "normal".

postmasterProses - proses itu juga menunjukkan Anda menjalankan PostgreSQL di latar belakang. Apakah ini normal untuk pengaturan Anda? PostgreSQL dalam konfigurasi default akan menggunakan RAM sangat sedikit, tetapi begitu disetel ulang untuk kecepatan, PostgreSQL dapat mengunyah 25% -40% dari RAM yang tersedia dengan cepat. Jadi saya hanya bisa menebak, mengingat jumlah mereka dalam output, Anda menjalankan beberapa jenis basis data produksi saat Anda menjalankan backup. Ini bukan pertanda baik. Bisakah Anda memberikan lebih banyak info tentang mengapa ini berjalan? Berapa ukuran parameter memori bersama untuk semuapostmasterproses? Apakah mungkin untuk mematikan layanan, atau mengkonfigurasi ulang basis data sementara untuk menggunakan lebih sedikit penghubung / buffer saat cadangan sedang berjalan? Ini akan membantu menghilangkan sebagian tekanan dari I / O yang sudah tegang dan membebaskan RAM. Perlu diingat bahwa setiap postmasterproses mengkonsumsi RAM di atas dan di luar apa yang digunakan database untuk caching internal. Jadi, ketika Anda melakukan penyesuaian pengaturan memori, berhati-hatilah tentang yang "dibagikan" dan yang "per-proses" .

Jika Anda menggunakan PostgreSQL sebagai bagian dari proses pencadangan Anda, cobalah untuk mengatur ulang untuk menerima hanya jumlah minimum koneksi , dan pastikan untuk mengecilkan parameter per-proses Anda ke sesuatu yang masuk akal (masing-masing hanya beberapa MB). Kelemahan dari ini adalah PostgreSQL akan tumpah ke disk jika tidak dapat bekerja dengan dataset dalam RAM seperti yang diinginkan, sehingga itu benar-benar akan meningkatkan I / O disk Anda , jadi dengarkan dengan cermat.

X11 dalam dan dari dirinya sendiri tidak memakan banyak memori, tetapi sesi desktop penuh dapat mengkonsumsi beberapa MB. Log out semua sesi aktif yang Anda miliki dan jalankan koneksi Anda dari konsol atau melalui SSH.

Tetap saja, saya tidak berpikir itu sepenuhnya masalah memori. Jika Anda lebih baik dari 50% I / O menunggu periode waktu yang lama (dan Anda memposting angka yang menyentuh 70-an), bottleneck yang dihasilkan pada akhirnya akan menghancurkan sisa dari sistem. Sama seperti Darth Vader yang meremukkan leher.

Seseorang di ujung bisnis cengkeraman kematian Darth Vader

Berapa banyak flush thread yang Anda konfigurasikan? Menggunakan

cat /proc/sys/vm/nr_pdflush_threads

untuk mencari tahu dan

echo "vm.nr_pdflush_threads = 1" >> /etc/sysctl.conf

untuk mengaturnya menjadi satu utas. Perhatikan bahwa perintah terakhir membuatnya memuat secara permanen saat reboot. Melihat 1 atau 2 di sana bukanlah hal yang aneh. Jika Anda memiliki beberapa core atau banyak spindle / kapasitas bus untuk I / O, Anda akan ingin menabrak ini (sedikit). Utas flush lebih banyak = lebih banyak aktivitas I / O, tetapi juga lebih banyak waktu CPU dihabiskan di I / O tunggu.

Apakah ini nilai default, atau sudahkah Anda menabraknya? Jika Anda menabraknya, sudahkah Anda mempertimbangkan mengurangi jumlah untuk mengurangi jumlah tekanan pada I / O ops? Atau apakah Anda memiliki banyak spindel dan saluran untuk dikerjakan, dalam hal ini, apakah Anda mempertimbangkan untuk menambah jumlah benang flush?

PS Anda ingin mengatur swappiness ke nilai yang lebih rendah, bukan nilai yang lebih tinggi, untuk mencegah swap-out. Nilai tertinggi = 100 = bertukar seperti orang gila ketika terasa benar, nilai terendah = 0 = cobalah untuk tidak bertukar sama sekali.

Avery Payne
sumber
Saya akan melihat beberapa saran Anda. Tidak, saya tidak gila dan menjalankan basis data produksi pada sistem cadangan. PostgreSQL adalah bagian dari sistem cadangan, karena Bacula menggunakannya sebagai penyimpan informasinya untuk melacak apa yang ada pada rekaman apa, dll. Saya akan melihat penyetelan beberapa parameter yang Anda tentukan. Throughput I / O yang tinggi adalah hasil dari server lain yang membuang data ke baki disk server ini, dan server ini kemudian menarik data tersebut dan menulisnya ke tape library LTO4.
Kamil Kisiel
Bagaimana cara mengatur disk server? Apakah Anda menggunakan pengaturan drive cermin?
Avery Payne
1
+1 untuk prosa ungu :)
pjc50
Ya, saya merasa sedikit kreatif hari itu. Maaf tentang drama ini. :)
Avery Payne
7

Jika Anda melihat blok yang dibaca per detik (bi) di bawah IO, itu mengerdilkan aktivitas swap dengan beberapa urutan besarnya. Saya tidak berpikir penggunaan swap adalah apa yang menyebabkan disk Anda meronta-ronta, saya pikir Anda memiliki sesuatu yang berjalan di kotak yang hanya menyebabkan banyak aktivitas disk (baca).

Saya akan menyelidiki aplikasi yang berjalan, dan melihat apakah Anda dapat menemukan pelakunya.

Christopher Cashell
sumber
Yah, seperti yang saya katakan, ini menjalankan sistem cadangan bacula. Blok di kemungkinan merupakan hasil dari server membuang data ke array disk SAS yang dilampirkan secara eksternal.
Kamil Kisiel
1
Apakah Anda yakin disk trash dari swap, dan bukan backup? Apa proses lain yang berjalan di kotak? Jika kernel cukup baru, ada beberapa alat yang sangat berguna di luar sana (iotop) yang dapat menggali ke dalam keberanian penggunaan IO, dan bahkan mengatur prioritas IO (ionice) jika Anda menggunakan penjadwal IO CFQ.
Christopher Cashell
6

Lihat apakah tautan ini menjawab beberapa pertanyaan Anda. Saya secara teratur melihat paging Linux (tidak menukar) memori jauh sebelum pemanfaatan 60%. Ini adalah bagian yang diharapkan dari penyetelan memorinya:

http://www.sheepguardingllama.com/?p=2252

Tetapi kekurangan buffer / cache membuat saya khawatir. Itu terlihat sangat tidak biasa. Jadi saya berpikir bahwa ada sesuatu yang lebih salah.

Scott Alan Miller
sumber
Hai - panggilan bagus - di mana buffer / cache? Apakah mereka dimatikan? Apakah ada sesuatu yang terus-menerus melemahkan mereka?
MikeyB
6

Bisakah Anda mencoba menonaktifkan swap sepenuhnya?

swapoff /dev/hdb2

atau semacamnya - setidaknya itu akan memvalidasi bahwa itu adalah masalah Anda, dan bukan sesuatu yang lain.

Tim Howland
sumber
+1 untuk mengonfirmasi bahwa dugaan diagnosis sebenarnya adalah penyebab masalahnya.
Wayne
Saya akan mencoba ini besok di tempat kerja. Juga, spaw saya tidak pada / dev / hdb2;)
Kamil Kisiel
Perlu dicatat bahwa meskipun, sebagai bantuan diagnosis yang baik, ini sangat berbahaya pada sistem produksi. Jika Anda benar - benar membutuhkan swap, Anda akan segera kehabisan RAM. Dan kemudian pembunuh Oom akan datang dan membunuh proses acak, yang mungkin saja DB produksi Anda ...
sleske
Setuju - Anda tidak boleh melakukan ini di dekat produksi.
Tim Howland
3

Secara default swappiness ditetapkan sebagai 60.

cat / proc / sys / vm / swappiness 60

Swappiness adalah kernel yang digunakan untuk men-tweak seberapa banyak kernel lebih memilih swap daripada RAM; swappiness tinggi berarti kernel akan banyak bertukar, dan swappiness rendah berarti kernel akan mencoba untuk tidak menggunakan ruang swap.

Kita dapat mengubah pengeditan ini nilai vm.swappiness di /etc/sysctl.conf .

nitin
sumber
Atau Anda dapat menulis persentase secara langsung di /proc/sys/vm/swappiness.
user2284570
2

Anda dapat secara manual mengatur swappinness dari kernel, yang dapat Anda lihat di /proc/sys/vm/swappinessatau mengeluarkan perintahsysctl vm.swappiness . Swappiness adalah pengaturan kernel yang menentukan berapa banyak swap digunakan.

Dengan mengatur sudo sysctl vm.swappiness=0Anda secara efektif menonaktifkan partisi swap. Untuk membuat perubahan ini permanen Anda dapat menambahkan / memodifikasi vm.swappiness=0di /etc/sysctl.conf. Anda harus melihat apa nilai yang baik untuk Anda. Saya pribadi mengonfigurasikannya vm.swappiness=10, menjadi nilai default.

voyager
sumber
Tidak cukup, dengan swappiness = 0 yang Anda katakan tidak pernah bertukar jika ada cara untuk menghindarinya, tetapi tetap bertukar jika satu-satunya pilihan lain adalah gagal alokasi atau membunuh OOM. Saya menemukan bahwa swappiness 30 adalah peningkatan yang bagus pada laptop, tetapi tidak perlu mengacaukannya pada sistem lain.
LapTop006
1

Hal lain yang mungkin ingin Anda lihat adalah antrian run kernel Anda dan proses yang tidak dapat terputus (kolom 'r' dan 'b' di vmstat) adalah indikator bahwa sistem jenuh pada suatu waktu. Sebagai tambahan, jangan bingung antara saturasi dengan utilisasi ... masalah sebenarnya mungkin adalah tumpukan proses yang kelaparan terhadap kernel jenuh :-(

Anda juga dapat menjalankan 'pmap -x [PID]' untuk mendapatkan detail memori tambahan dari beberapa proses yang lebih memakan. Semoga beruntung!

Mat

Matt Cummings
sumber
1

Mungkin Anda memiliki proses yang berumur pendek yang menggunakan banyak memori, kemudian keluar sebelum Anda mendapatkan kesempatan untuk melihatnya.

Ini akan konsisten dengan apa yang Anda lihat.

MarkR
sumber
1

Sudahkah Anda menyelidiki masalah dengan cache inode? slabtopsetidaknya harus memberi Anda titik awal jika Anda mengalami sesuatu seperti ini.

serverhorror
sumber
0

Meskipun sistem Anda 64bit, sistem mungkin tidak dapat benar-benar mengatasi semua memori yang tersedia. Ini adalah batasan chipset. Sebagai contoh, Mac mini generasi sebelumnya "mendukung" 4GB ram tetapi hanya 3.3GB yang benar-benar dialamatkan.

Dustin
sumber
Ini adalah SGI Altix XE240, saya cukup yakin dapat mendukung lebih dari 4 GB RAM karena saya telah menggunakan unit demo dengan 32 GB.
Kamil Kisiel
Ini bukan batasan chipset di mini lama, chipset itu bisa sampai 8GB, namun Apple tidak menambahkan garis pengalamatan untuk menanganinya dengan benar (IIRC, tetapi ada kasus umum di antara beberapa produsen)
LapTop006