Haruskah saya khawatir bahwa swap sedang digunakan pada host dengan hampir 40GB memori bebas?

39

Saya memiliki host produksi, di bawah:

htop

Sistem ini menggunakan 1GB swap, sambil mempertahankan hampir 40GB ruang kosong yang tidak digunakan. Haruskah saya khawatir tentang ini, atau sebagian besar normal?

MrDuk
sumber
23
Sebenarnya, Anda harus khawatir tentang host produksi dengan beban nyata yang menghabiskan hampir 40GB memori. Tentunya itu bisa digunakan untuk meletakkan memori itu - aplikasi mengakses disk, tidak bisakah menggunakan memori itu untuk men-cache beberapa data itu, mengurangi I / O, dan meningkatkan kinerjanya? Mengapa 40GB memori terbuang pada mesin yang bekerja? Itulah yang harus Anda perhatikan. Itu tidak normal.
David Schwartz
25
Ini benar-benar akan lebih berguna jika Anda menunjukkan kepada kami output dari free -m. Grafiknya sulit dibaca.
user9517 mendukung GoFundMonica
@ Davidvidchwartz - Saya punya pertanyaan terkait yang masih aktif tentang hal itu. serverfault.com/questions/825909/...
MrDuk

Jawaban:

68

Ini bukan masalah dan kemungkinan normal. Banyak kode (dan mungkin data) yang digunakan sangat jarang sehingga sistem akan menukar keluar untuk membebaskan memori.

Bertukar sebagian besar hanya masalah jika memori sedang ditukar masuk dan keluar terus menerus. Ini adalah jenis kegiatan yang membunuh kinerja dan menyarankan masalah di tempat lain pada sistem.

Jika Anda ingin memantau aktivitas swap Anda, Anda dapat dengan beberapa utilitas tetapi vmstatbiasanya cukup berguna misalnya

$ 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  0      0 348256  73540 274600    0    0     1     9    9    6  2  0 98  0  0
 0  0      0 348240  73544 274620    0    0     0    16   28   26  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   29   33  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   21   23  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   24   26  0  0 100  0  0
 0  0      0 348240  73544 274620    0    0     0     0   23   23  0  0 100  0  0

Abaikan baris pertama karena itu adalah aktivitas sejak sistem dimulai. Perhatikan sidan sokolom di bawah ---swap--; mereka umumnya angka yang cukup kecil jika tidak 0 untuk sebagian besar waktu.

Juga patut disebutkan adalah bahwa swap preemptive ini dapat dikontrol dengan pengaturan kernel. File at /proc/sys/vm/swappinessberisi angka antara 0 dan 100 yang memberitahu kernel seberapa agresif menukar memori. Cat file untuk melihat apa ini diatur. Secara default, sebagian besar distro Linux menetapkan standar ini menjadi 60, tetapi jika Anda tidak ingin melihat pertukaran sebelum kehabisan memori, gema 0 ke dalam file seperti ini:

echo 0 >/proc/sys/vm/swappiness

Ini dapat dibuat permanen dengan menambahkan

vm.swappiness = 0

untuk /etc/sysctl.conf.

user9517 mendukung GoFundMonica
sumber
14
Juga patut disebutkan adalah bahwa swap preemptive ini dapat dikontrol dengan pengaturan kernel. File di / proc / sys / vm / swappiness berisi angka antara 0 dan 100 yang memberitahu kernel seberapa agresif menukar memori. Cat file untuk melihat apa ini diatur. Secara default, kebanyakan distro Linux secara default ini untuk 60, tetapi jika Anda tidak ingin melihat swapping sebelum memori habis, echo 0 ke dalam file seperti ini: echo 0 >/proc/sys/vm/swappiness. Ini bisa dibuat permanen dengan menambahkan vm.swappiness = 0ke /etc/sysctl.conf.
virtex
@virtex: Saya suka menggunakan swappiness = 1, atau hanya kurang dari 10, di desktop saya. Itu mungkin baik pada server sebagian besar waktu juga. Sangat mencegah bertukar untuk membebaskan RAM untuk pagecache lebih banyak, tanpa melarang sama sekali.
Peter Cordes
1
@PeterCordes Berhati-hatilah terhadap server, terutama yang mengakses database atau melayani file. Mereka mungkin mendapat banyak manfaat dari memori yang tersedia untuk cache file.
Jonas Schäfer
4
@JonasWielicki: Bahkan dengan swappiness=7atau sesuatu, halaman yang tidak terpakai dalam jangka panjang bisa ditukar. Ada perbedaan besar antara swappiness=0dan nilai lainnya, bahkan nilai rendah. Kernel-default swappiness=60umumnya baik untuk server, dan itu hanya untuk penggunaan interaktif desktop di mana swappiness rendah baik. Tetapi pengaturan ke 7 atau sesuatu seharusnya tidak terlalu sakit. (Tapi saya belum memeriksa, saya bukan sysadmin server).
Peter Cordes
2
@PeterCordes Sampai Anda menekan memori, semua swappinessberfungsi dengan baik. Dengan tekanan, Anda akan melihat bahwa swappiness=7kelaparan file cache hampir sepenuhnya untuk jangka waktu yang lama, sementara swappiness=60melikuidasi banyak cache tetapi juga mulai bertukar keluar dalam hitungan detik. Itu masih cache yang mengambil pemukulan, tetapi dengan cara yang jauh lebih seimbang.
kubanczyk
25

Linux akan lebih dulu menulis halaman ke disk jika tidak ada yang lebih baik untuk dilakukan. Itu tidak berarti bahwa itu akan mengusir halaman-halaman itu dari memori. Hanya saja kalau-kalau itu harus mengusir halaman-halaman itu di masa depan, tidak perlu menunggu mereka ditulis ke disk, karena mereka sudah ada di sana.

Lagi pula, alasan Anda kehabisan memori, mungkin karena mesin Anda sudah bekerja keras, Anda tidak ingin menambah beban dengan bertukar. Lebih baik melakukan swapping ketika mesin tidak melakukan apa-apa.

Untuk alasan yang sama, memori Anda harus selalu penuh. Halaman memori, cache sistem file tmpfs,, ada begitu banyak hal yang dapat disimpan dalam memori. Sungguh, Anda harus khawatir jika ingatan Anda kosong; setelah semua, Anda membayar banyak uang untuk itu (setidaknya dibandingkan dengan jumlah ruang disk yang sama), jadi lebih baik digunakan!

Jörg W Mittag
sumber
Jorg, halaman-halaman yang sebelumnya ditulis kernel untuk disk bukan halaman swap, adalah halaman cache disk kotor. Tunnables vm.dirty_background _... mengontrol itu. Aktivitas swap out dimulai sesuai dengan tunnable swapiness dan tidak menunggu waktu idle.
Lucas
11

Swap yang digunakan tidak buruk, tetapi banyak aktivitas swap

  vmstat 1
  procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
  6  0 521040 114564   6688 377308    8   13   639   173    0 1100  5  4 90  0
  1  0 521040 114964   6688 377448    0    0   256     0    0 1826  3  4 94  0
  0  0 521040 115956   6688 377448    0    0     0     0    0 1182  7  3 90  0
  0  0 521036 115992   6688 377448    4    0    16     0    0 1154 10  2 88  0
  3  0 521036 114628   6696 377640    0    0   928   224    0 1503 15 17 67  1

Kolom swapd tidak ada masalah sama sekali. Nilai bukan nol pada kolom si dan sangat mematikan untuk kinerja server. Khususnya yang memiliki banyak RAM.

Cara terbaik untuk menonaktifkan swapinness pada mesin dengan ram ram beberapa GB:

sysctl -w vm.swappiness=0

Ini tidak akan menonaktifkan swap. Ini hanya akan menginstruksikan Linux untuk menggunakan swap sebagai langkah terakhir. Ini akan menyia-nyiakan beberapa MB program yang tidak perlu di RAM ... Tetapi lebih baik untuk menukar kembung antrian akses disk Anda.

Sunting 1: mengapa nilai default swappiness tidak optimal

Kita harus mengingat dua dekade lalu, 486 besar hanya memiliki 32Mb RAM. Algoritma swap dikembangkan ketika seluruh RAM dapat dipindahkan ke disk dalam sepersekian detik. Bahkan dengan disk yang lebih lambat saat itu. Itulah sebabnya kebijakan swap default sangat agresif. RAM adalah hambatan saat itu. Sejak itu ukuran RAM meningkat lebih dari 10.000 kali dan kecepatan disk kurang dari 10 kali. Ini menggeser hambatan ke bandwidth disk.

Sunting 2: mengapa begitu aktivitas berakibat fatal bagi server?

Si dan sebagainya aktivitas di mesin dengan ton RAM adalah mematikan karena berarti sistem sedang berjuang dengan dirinya sendiri untuk RAM. Apa yang terjadi adalah disk, bahkan penyimpanan besar terlalu lambat jika dibandingkan dengan RAM. Pertukaran agresif mendukung cache disk kernel daripada data aplikasi dan merupakan sumber yang paling umum untuk memperjuangkan RAM. Sejak OS harus cache disk gratis pada setiap si , waktu untuk hidup dari cache tambahan yang Swap memberikan terlalu rendah untuk menjadi berguna lagian. Hasilnya adalah Anda mengambil bandwidth disk untuk menyimpan cache yang mungkin tidak akan digunakan dan menjeda program Anda menunggu halaman si . Berarti mengkonsumsi banyak sumber daya kritis dengan sedikit atau tanpa manfaat untuk aplikasi.

Perhatikan judul respons "banyak aktivitas swap di server dengan banyak RAM". Ini tidak berlaku untuk mesin dengan si dan aktivitas sesekali. Ini mungkin tidak berlaku di masa depan jika algoritma pertukaran yang lebih pintar dikembangkan di OS.

Sunting 3: halaman "dingin"

Orang meromantiskan algoritma swapping. Ada yang mengatakan "ini membutuhkan lebih sedikit halaman RAM yang digunakan", tetapi ini bukan yang dilakukan kernel sama sekali. Masalahnya yang sulit dipahami tentang swap adalah kernel tidak tahu apa itu "halaman dingin". Kernel tidak memiliki metrik yang baik untuk menentukan apakah halaman tersebut digunakan atau kemungkinan akan digunakan dalam waktu dekat. Untuk menghindari bahwa kernel menempatkan halaman di swap lebih atau kurang secara acak dan halaman yang tidak diperlukan tetap di sana. Masalah dari algoritma itu adalah bahwa halaman harus pergi ke swap untuk mengetahui apakah mereka diperlukan oleh aplikasi. Dan ini berarti banyak halaman "panas" akan ditukar. Masalah dengan itu adalah disk terlalu lambat dibandingkan dengan RAM.

Saya membuat tolok ukur sendiri yang merupakan skenario realistis yang sangat umum pada banyak aplikasi dengan volume yang layak. Dari pengujian saya, saya tidak melihat manfaat pada throughput atau latensi ketika swap sedang digunakan. Jauh dari itu. Ketika swapping dimulai, memperlambat throughput dan latensi setidaknya dengan urutan besarnya.

Saya melangkah lebih jauh tentang ini: Saya mengerti swap bukan untuk diproses. Swap hanya untuk keadaan darurat. Saat-saat ketika terlalu banyak aplikasi berjalan pada saat yang sama dan Anda mendapatkan lonjakan memori. Tanpa swap ini akan menyebabkan kesalahan kehabisan memori. Saya menganggap penggunaan swap sebagai kegagalan tim pengembangan dan produksi. Ini hanya pendapat yang jauh melampaui apa yang kita bahas di sini, tetapi itulah yang saya pikirkan. Tentu saja aplikasi saya memiliki manajemen memori yang luar biasa.

Lucas
sumber
9
"Terbaik untuk menonaktifkan swapinness" Terbaik, mengapa? (Terbaik, untuk tujuan apa?) Defaultnya mungkin tidak tepat untuk semua penggunaan, tapi saya masih perlu alasan untuk mengubahnya.
jpaugh
3
Bagaimana cara simematikan server Anda bi? Keduanya berarti beberapa program menunggu 4096 byte untuk dibaca dari disk ke memori. Ini bidari file apa pun, dan sidari kategori sempit file tertentu (tetapi byte mereka bergerak sama cepatnya melalui jalur yang sama).
kubanczyk
2
486 dengan 128MB ram sangat langka dan akan dianggap sebagai mainframe atau superkomputer - dengan demikian CPU tidak mungkin 486. 486 lama saya memiliki 4MB RAM dan saya iri dengan mesin teman saya dengan 16MB ram (server besar) memiliki 16 hingga 32 MB RAM). Maju cepat ke Pentium dan kami mulai melihat 8 hingga 16 MB seperti biasa. Ketika Pentium3 pertama kali muncul (ketika CPU mulai normal melebihi 1GHz) 32MB adalah normal dan server web biasanya memiliki 64 hingga 128MB.
Slebetman
swappiness=0tampaknya sama sekali tidak pantas untuk server. Anda mungkin mempertimbangkannya untuk sistem desktop interaktif (tapi meskipun begitu, itu swappiness=1adalah pilihan yang lebih baik untuk akhirnya mengganti halaman yang sangat dingin). Lihat komentar pada jawaban lain . swappiness=7atau sesuatu akan mengurangi aktivitas swap secara dramatis tanpa menyematkan halaman dingin ke dalam RAM hingga OOM, dan patut dipertimbangkan jika Anda pikir 60terlalu berlebihan untuk server tertentu.
Peter Cordes
1
@ Kubanczyk: Saya pikir silebih buruk daripada bi. Sebagian besar perangkat lunak server dirancang dengan asumsi bahwa I / O dari disk mungkin lambat, dan menggunakan utas, I / O async, atau beberapa teknik lain untuk tetap responsif secara umum sambil menunggu I / O. Kesalahan halaman bisa terjadi di mana saja. Dalam kasus terburuk, kesalahan halaman lambat dapat terjadi setelah mengambil kunci, memblokir semua utas lainnya dari memasuki bagian kritis selama ~ 10 ms (dengan swap pada penyimpanan rotasi lambat). Itu mungkin masuk akal jika bagian kritis menyalin data dari struktur data bersama ke halaman yang berpotensi dingin.
Peter Cordes
8

Ini bukan jawaban untuk pertanyaan Anda; melainkan, hanya informasi tambahan untuk membantu Anda membuat keputusan.

Jika Anda ingin mengetahui proses apa yang secara spesifik menggunakan berapa banyak swap, berikut adalah skrip shell kecil:

#!/bin/bash

set -o posix
set -u

OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"` ; do
  PID=`echo $DIR | cut -d / -f 3`
  PROGNAME=`ps -p $PID -o comm --no-headers`

  SUM=0
  for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'` ; do
    let SUM=$SUM+$SWAP
  done
  echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"

  let OVERALL=$OVERALL+$SUM
done
echo "Overall swap used: $OVERALL"

Saya juga harus menambahkan bahwa tmpfs juga akan bertukar. Ini lebih umum pada sistem linux modern menggunakan systemd yang membuat overlay ruang-pengguna / tmp menggunakan tmpfs.

Harun
sumber
Naskah yang bagus. Lihatlah juga smem.
user9517 mendukung GoFundMonica
Saya pikir Anda bisa menulis yang jauh lebih efisien ( proses bercabang jauh lebih sedikit) dengan awk '/Swap/ {sw += $2} FNR==1 { /*first line of a new file */ find the command somehow, maybe still fork/exec ps;} END { print totals }' /proc/[0-9]*/smaps. Itu berjalan memotong dan ps untuk setiap proses, dan grep + awk beberapa kali untuk setiap proses dalam sistem.
Peter Cordes
0

Saya perhatikan replikasi MySQL Cluster melambat atau gagal ketika agen bertukar banyak. Mungkin beberapa aplikasi tidak keberatan atau bahkan mungkin mendapat manfaat dari beberapa pertukaran tetapi database tampaknya benar-benar menderita karenanya. Namun banyak diskusi yang saya lihat di forum membahas swap yang didekontekstualisasikan dari diskusi beban kerja khusus.

Di dunia DBA, konsensus tampaknya adalah "Ini masuk akal bahwa ketika Anda menjalankan MySQL (atau benar-benar DBMS lainnya) Anda tidak ingin melihat I / O di ruang swap Anda. Menskalakan ukuran cache (menggunakan ukuran innodb_buffer_pool_size dalam kasus MySQL) adalah praktik standar untuk memastikan ada cukup memori kosong sehingga swapping tidak diperlukan.

Tetapi bagaimana jika Anda melakukan kesalahan atau salah perhitungan, dan swapping terjadi? Seberapa besar dampaknya terhadap kinerja? Inilah yang ingin saya selidiki. "

Saya harap pembaca akan menemukan tautan berikut ini.

https://www.percona.com/blog/2017/01/13/impact-of-swapping-on-mysql-performance/

https://www.percona.com/blog/2010/01/18/why-swapping-is-bad-for-mysql-performance/

Ross Nesbitt
sumber
1
Selamat Datang di Kesalahan Server! Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Frederik Nielsen