VPS için swap alanı gerekli mi ve nasıl boyutlandırılır?
Çoğu bulut imajında swap kapalı gelir. Küçük bir VPS üzerinde OOM killer tetiklenmesini önlemek için swap dosyası ekleme, vm.swappiness ayarı ve zram kullanımı anlatılmaktadır.
VPS'nizin swap alanına ihtiyacı var mı?
Çoğu bulut imajı swap alanı olmadan gelir ve küçük bir VPS üzerinde cevap genellikle evet, bir swap dosyası eklenmelidir şeklindedir. Swap, 1 GB'lık bir sunucuyu 2 GB'lık bir sunucu gibi çalıştırmaz. Çekirdeğe, kullanılmayan anonim sayfaları yerleştirebileceği bir alan sağlar; bu da sayfa önbelleğinin (page cache) verimli kalmasını sağlar ve OOM killer'ı (bellek tükendiğinde bir süreci seçip sonlandıran çekirdek rutini) ilk seçenek olmaktan çıkarıp son çare haline getirir.
Kısaca: Birkaç uzun ömürlü servis çalıştıran bir makinede, küçük bir swap dosyası kapladığı disk alanına değer. Tek bir sürecin düzenli olarak makinenin toplam belleğinden fazlasını ayırmaya çalıştığı bir makinede ise swap sizi kurtarmaz; sadece hatanın daha yavaş gerçekleşmesine ve tespit edilmesinin zorlaşmasına neden olur. Bu kılavuzun geri kalanı, bu iki durumu birbirinden ayırmayı ve yalnızca VPS'lerde ortaya çıkan iki maliyeti anlatmaktadır.
Aşağıdaki her komut kendi sunucunuzda root yetkisi gerektirir, bu nedenle başkasının makinesinden alınan çıktıları kopyalamak yerine komutları kendi sunucunuzda çalıştırın.
Swap alanının gerçek işlevi ve yapmadıkları
Linux belleği iki türden oluşur. Dosya destekli sayfalar (file backed pages), diskte zaten var olan verilerin kopyalarıdır: programlarınız ve yakın zamanda okuduğunuz her dosya. Bu koleksiyon, sayfa önbelleğini (page cache) oluşturur. Anonim sayfalar ise arkasında bir dosya bulunmayan bellek alanlarıdır: heap, stack ve bir veritabanının çalışma zamanında ayırdığı alanların çoğu.
Bellek yetersiz kaldığında çekirdek sayfaları geri kazanmak zorundadır. Temiz bir dosya destekli sayfayı geri kazanmak kolaydır, çünkü diskteki kopyası mevcuttur ve sayfa daha sonra tekrar okunabilir. Anonim bir sayfa için bu geçerli değildir, çünkü tek kopyası RAM'dedir. Swap alanı yoksa çekirdeğin anonim bellek için iki seçeneği vardır: belleği tutmak veya o belleğe sahip süreci sonlandırmak.
Swap alanı olmayan bir sunucu yine de sayfalama yapar. Sadece yanlış bellek alanlarını sayfalar. Baskı altında çekirdek, sayfa önbelleğini küçültür ve kısa süre sonra tekrar ihtiyaç duyacağı dosya sayfalarını (çalışan programların yürütülebilir metinleri dahil) bellekten atar. Bu sayfalar daha sonra "major page fault" olarak geri döner. vmstat aracının bi sütununda disk okuma işlemlerini ve /proc/vmstat içinde yükselen bir pgmajfault sayacını görürsünüz; bu sırada si ve so değerleri sürekli sıfırda kalır. Sunucu "thrashing" durumuna düşer ancak swap sayaçları hiçbir şey rapor etmez.
Swap alanının yapmadığı şey kapasite artırmaktır. Eğer çalışma kümesi (yani fiilen erişilen sayfalar) RAM'den büyükse, swap alanı "out of memory" (bellek yetersizliği) nedeniyle gerçekleşecek bir süreci sonlandırma işlemini, çok yavaş çalışan bir sunucuya dönüştürür. Bazen tercih ettiğiniz durum bu olabilir; çünkü yavaş bir sunucuya giriş yapıp onarım yapabilirsiniz, ancak sonlandırılmış bir veritabanını onaramazsınız. Bazen ise bu durum daha kötüdür; çünkü yavaşlayan sunucu tüm bağlantıları açık tutarken sağlık kontrollerinden (health checks) başarısız olmaya devam eder. Swap eklemeden önce hangisini istediğinize karar verin.
Bulut imajları neden swap olmadan sunulur?
Bu bilinçli bir tercihtir. Tek bir imajın, bir sağlayıcının sattığı her planda önyüklenebilmesi gerekir; bu nedenle sabit bir swap bölümü, küçük planlarda disk alanını boşa harcayacak, büyük planlarda ise anlamsız kalacaktır. Swap hızı ayrıca konuk sistemin altındaki depolama birimine bağlıdır ve imaj bunu önceden bilemez. İmaj oluşturucular öngörülebilir davranış için optimizasyon yaparlar; çünkü anında sonlanan bir süreci teşhis etmek, ayakta kalan ancak her isteğe saniyeler geç yanıt veren bir makineyi teşhis etmekten daha kolaydır.
Bu nedenler, tek kullanımlık makineleri tanımlar. Sürekli kullandığınız bir VPS ise farklı bir durumdur. Onu değiştirmek yerine onarırsınız; bu yüzden birkaç saniyelik sayfalama (paging), genellikle sonlandırılmış bir servisten daha iyidir. Eksik swap alanını, başkasının kullanım senaryosu için oluşturulmuş bir varsayılan olarak değerlendirin.
VPS üzerinde swap dosyası mı yoksa swap bölümü mü kullanılmalı?
Bir dosya kullanın. Bir bölüm kullanmak, halihazırda bölümlenmiş bir disk üzerinde çalışan kök dosya sistemini yeniden boyutlandırmayı gerektirir; bu da hiçbir kazanç sağlamadan ciddi risk oluşturur. Bir dosya ise standart komutlarla oluşturulup silinebilir ve bölüm tablosuna dokunmadan boyutu daha sonra değiştirilebilir.
Hız, belirleyici bir faktör değildir. swapon anında çekirdek, dosyanın kapsam haritasını (extent map) bir kez okur ve ardından G/Ç işlemlerini doğrudan blok aygıtına iletir; bu nedenle dosya sistemi, her sayfa giriş ve çıkışında işlem yolunda yer almaz. Aynı disk üzerinde, bir swap dosyası ile bir swap bölümü aynı performansı gösterir.
Bilinmesi gereken iki sınır vardır. Swap alanını NFS (network file system) gibi bir ağ dosya sistemi üzerine koymayın. Ayrıca btrfs üzerinde dosyanın copy on write özelliği devre dışı bırakılmış ve sıkıştırma kapalı olmalıdır; btrfs'in kendi swap oluşturma yardımcısını sunmasının nedeni budur.
Ubuntu veya Debian üzerinde swap dosyası ekleme
Herhangi bir değişiklik yapmadan önce mevcut durumu kontrol edin.
swapon --show
free -h
findmnt -no FSTYPE /swapon --show komutundan boş çıktı gelmesi, swap alanının hiç olmadığını gösterir; bu, yeni bir bulut imajı için normal bir durumdur. findmnt komutu kök dosya sistemi türünü yazdırır; dosyanın nasıl oluşturulacağına bu bilgi karar verir. Çoğu bulut imajında kullanılan ext4 üzerinde fallocate kullanımı güvenlidir.
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfilechmod komutu, mkswap komutundan önce kasıtlı olarak yer alır. Bu adımı atlarsanız mkswap size şunu söyler: mkswap: /swapfile: insecure permissions 0644, fix with: chmod 0600 /swapfile. Herkesin okuyabildiği bir swap dosyası, diğer süreçlerin belleğe attığı verileri sunucudaki her kullanıcıya açık hale getirir. Sağlıklı bir mkswap komutu, Setting up swapspace version 1, size = 2 GiB (2147479552 bytes) gibi bir satırla boyutu doğrular.
xfs veya btrfs üzerinde son komut swapon: /swapfile: swapon failed: Invalid argument hatasıyla başarısız olabilir. XFS üzerinde bu durum, fallocate komutunun yazılmamış kapsamlar (extents) bırakmasından kaynaklanır; bu nedenle baytları doğrudan yazın.
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progressbtrfs üzerinde bunun nedeni "copy on write" özelliğidir ve güncel btrfs-progs komutu sizin için gerekli bayrakları ayarlar.
sudo btrfs filesystem mkswapfile --size 2g /swapfileHer iki durumda da işlemi chmod 600, uygunsa mkswap ve swapon ile tamamlayın, ardından sonucu doğrulayın.
swapon --show
free -hswapon --show komutu, file türünde ve istediğiniz boyutta /swapfile dosyasını listelemelidir; free -h komutu ise neredeyse hiç kullanılmamış bir Swap satırı göstermelidir. Yeni bir kurulumda sıfır swap kullanımı doğrudur. Çekirdek, sayfaları yalnızca bir gerekçesi olduğunda oraya taşır.
Ayarların yeniden başlatma sonrasında da kalıcı olmasını sağlayın ve girişi hemen test edin.
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo swapoff /swapfile
sudo swapon -a
swapon --showswapon -a komutu /etc/fstab dosyasını okur, bu yüzden hatalı bir satır hemen gözünüzün önünde başarısız olur. Test etmediğiniz bir yazım hatası, sunucunun swap olmadan açıldığı plansız bir yeniden başlatma sırasında karşınıza çıkar.
Swap alanını daha sonra kaldırmak için sudo swapoff /swapfile komutunu çalıştırın, fstab satırını silin ve ardından sudo rm /swapfile komutunu uygulayın. swapoff komutu, belleğe atılmış her sayfayı önce RAM'e geri okumak zorundadır; bu nedenle yoğun bir sunucuda swapoff: /swapfile: swapoff failed: Cannot allocate memory hatasıyla başarısız olabilir. Biraz bellek boşaltın ve tekrar deneyin.
Swap dosyası ne kadar büyük olmalıdır?
Swap dosyası, aktif olmayan anonim sayfaları tutmak için kullanılır; bu nedenle önemli olan RAM miktarı değil, ayrılan belleğin ne kadarının gerçekten boşta olduğudur. Boşta kalan bellek miktarı plan boyutuyla aynı oranda artmaz, bu yüzden planlar büyüdükçe çarpan değeri düşer. Bu kılavuzda kullanılan kural budur.
The data behind this chart
[
{
"label": "1 GB plan",
"swap_gb": 2,
"swap_x_ram": 2
},
{
"label": "2 GB plan",
"swap_gb": 2,
"swap_x_ram": 1
},
{
"label": "4 GB plan",
"swap_gb": 2,
"swap_x_ram": 0.5
},
{
"label": "8 GB plan",
"swap_gb": 4,
"swap_x_ram": 0.5
},
{
"label": "16 GB plan",
"swap_gb": 4,
"swap_x_ram": 0.25
}
]En küçük planda swap boyutu 2 GB'tır; bu da RAM miktarının 2 katına denk gelir. Bunun nedeni, 1 GB belleğe sahip bir sunucunun çok az hareket alanına sahip olması ve ani bir yük artışının OOM killer mekanizmasını tetiklemesidir. Tablonun üst kısmında ise swap boyutu 4 GB veya RAM miktarının 0.25 katı ile sınırlandırılmıştır. Bunun sebebi, paylaşımlı depolama üzerinde bu kadar büyük miktarda verinin sayfalanmasının, sunucunun fiilen kullanılamaz hale gelmesine neden olacak kadar uzun sürmesidir. Disk alanınız kısıtlıysa bu değerleri düşürebilirsiniz, çünkü swap dosyası doğrudan disk alanı tüketir.
Swap boyutunu RAM miktarına eşit veya ondan büyük tutmanın klasik nedeni hazırda bekletme (hibernation) özelliğidir; bu özellik tüm bellek görüntüsünü swap alanına yazar. Bir VPS hazırda bekletilemeyeceği için bu kural sizin için geçerli değildir.
vm.swappiness parametresi gerçekte neyi değiştirir?
vm.swappiness bir RAM yüzdesi veya bir eşik değeri değildir. Çekirdeğin, anonim sayfaların geri kazanılmasına, dosya sayfalarına kıyasla atadığı göreceli maliyettir. Varsayılan değer 60'tır. Bu değeri düşürdüğünüzde çekirdek, sayfa önbelleğini (page cache) boşaltmayı tercih eder. Yükselttiğinizde ise çekirdek, anonim belleği swap alanına taşımaya (page out) eğilim gösterir.
Bu, her iki yönde de bir takastır. vm.swappiness = 10 değerinde bir veritabanı, ayırdığı bellek alanlarını daha fazla RAM'de tutar; bunun bedelini ise önbellekten yeni çıkardığı dosyaları tekrar okuyarak öder. Asıl işi dosya sunmak olan bir makinede bu yanlış bir tercihtir, çünkü orada asıl işi yapan sayfa önbelleğidir.
Değeri 0 yapmak swap'ı kapatmaz. Bu, çekirdeğe bellek neredeyse tamamen tükenene kadar anonim bellek geri kazanımından kaçınmasını söyler; bu da OOM killer sürecini geciktirmek yerine öne çeker. Eğer swap istemiyorsanız, swap dosyasını kaldırın.
sysctl vm.swappiness
printf 'vm.swappiness = 10\n' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system
sysctl vm.swappinessDoğrudan sysctl -w üzerinden yapılan bir ayar bir sonraki yeniden başlatmaya kadar geçerlidir ve ardından sessizce etkisini yitirir; bu nedenle ayarı /etc/sysctl.d/ altındaki dosyaya yazın. 5.8 sürümünden itibaren çekirdekler 0 ile 200 arasındaki değerleri kabul eder. 100'ün üzerindeki değerler yalnızca swap hızı RAM ile neredeyse aynı olduğunda anlamlıdır, bu da zram kullanımı anlamına gelir.
zram: disk yerine CPU maliyeti olan takas alanı (swap)
zram, RAM üzerinde çalışan sıkıştırılmış bir blok aygıtıdır. Bunu takas alanı olarak kullandığınızda, diske gönderilecek sayfalar sıkıştırılarak bellekte tutulur. Disk G/Ç işlemi gerçekleşmez ve disk kotası harcanmaz. Bunun maliyeti, her sayfa giriş ve çıkışında harcanan CPU süresi ve sıkıştırılmış sayfaların kapladığı, uygulamalarınızın artık kullanamayacağı RAM miktarıdır.
Anonim sayfalar için genellikle 2:1 ile 3:1 arasında sıkıştırma oranları bildirilmektedir; kendi değerinizi zramctl komutunun DATA ve COMPR sütunlarında görebilirsiniz. Bazı iş yükleri neredeyse hiç sıkıştırılamayan veriler içerdiğinden, genel kabul görmüş rakamlara göre plan yapmak yerine ölçüm yapın.
sudo apt install zram-toolsALGO=zstd ve PERCENT=25 değerlerini /etc/default/zramswap dosyasında ayarlayın, ardından servisi yeniden başlatarak sonucu inceleyin.
sudo systemctl restart zramswap
zramctl
swapon --showPERCENT toplam RAM'in bir yüzdesidir; dolayısıyla 4 GB kapasiteli bir sunucuda 25 değeri, sıkıştırılmış sayfalar için 1 GB'a kadar alan ayırır. Düşük bir değerle başlayın ve yalnızca zramctl aygıtın dolduğunu gösterdiğinde bu oranı artırın. Aynı dosyadaki PRIORITY ayarı, çekirdeğin hangi takas alanını öncelikli dolduracağını belirler: yüksek değer kazanan taraftır. Standart swapon ile eklenen bir disk takas dosyası negatif öncelik alır; bu sayede zram öncelikli kullanılır ve dosya yalnızca taşma durumunda devreye girer. swapon --show her iki değeri de PRIO sütununda gösterir. zram-tools yerine systemd-zram-generator kullanan dağıtımlarda aynı ayarlar /etc/systemd/zram-generator.conf dosyasında bulunur.
zram, CPU kapasitesi yeterli olan ancak disk alanı kısıtlı sunucular için uygundur. CPU kaynağının zaten yetersiz olduğu durumlarda yanlış bir tercihtir; çünkü sıkıştırma işlemleri, uygulama ile aynı kaynak dilimi için rekabet eder.
VPS üzerinde karşılaşılan iki swap tuzağı
İlk tuzak disk kullanımıdır. 2 GB boyutunda bir swap dosyası oluşturduğunuz anda, alanın önceden ayrılması gerektiği için planınızın disk kapasitesinden 2 GB eksilir. df -h / değeri anında bu miktar kadar düşer ve dosyayı silmediğiniz sürece eski haline dönmez. Küçük bir planda bu ciddi bir dilimdir ve tamamen dolan bir root dosya sistemi, swap'in çözebileceğinden çok daha fazla soruna yol açar. Bu dosya du çıktısında da görünür; diskte yer açmaya çalışırken df ve du komutlarının disk kullanımında neden farklı sonuçlar verdiği konusunu hatırlamakta fayda vardır.
İkinci tuzak ise gecikmedir. Swap I/O işlemleriniz, ana makinenin diğer konuklarla paylaştığı depolama birimine gider ve siz kendi konuğunuzun içinden onların yükünü göremezsiniz. Yalnızca sonucu görürsünüz: normalde hızlı olması gereken bir sayfa okuma işlemi bazen çok daha uzun sürer ve sayfayı bekleyen süreç, veri gelene kadar durur. Bu durum, çalışma kuyruğu yerine disk kuyruğuna uygulanan paylaşımlı sunucularda CPU steal time mantığıyla aynıdır. Kendi sunucunuzda ölçüm yapın, çünkü yayınlanan herhangi bir gecikme değeri sadece başkalarının komşularının durumunu yansıtır.
Swap kullanımının performansınızı düşürüp düşürmediğini nasıl anlarsınız?
Swap alanının dolu olması bir sorun değildir. Sorun, swap trafiğidir. Swap alanında yüzlerce megabaytlık veri tutan ancak herhangi bir sayfalama (paging) etkinliği göstermeyen bir sunucu, sadece saatlerdir erişilmeyen verileri bellekten taşımıştır; bu istenen bir durumdur.
Toplam değerler yerine oranları izleyin.
vmstat 1 5si ve so, saniyede swap alanına yazılan ve buradan okunan kibibayt miktarıdır. Sağlıklı bir sunucuda, swpd sütununda ne yazarsa yazsın, bu değerler sıfır veya sıfıra yakın kalır. so değerinin sürekli yüksek olması ve aynı anda si değerinin artması, sayfaların sürekli yazılıp hemen geri çekildiği, yani sistemin "thrashing" durumuna girdiği anlamına gelir.
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 3 1048572 38210 4096 61440 912 1180 2210 1290 1402 2890 9 7 12 72 0Bu örnek, sorunlu bir sunucuyu göstermektedir ve en net sinyal swap sütunlarında değildir. wa değerinin 72 olması, işlemcinin zamanının büyük kısmını G/Ç (I/O) bekleyerek geçirdiğini; b değerinin 3 olması ise üç sürecin engellendiğini gösterir.
PSI (pressure stall information), bu soruya daha doğrudan yanıt verir.
cat /proc/pressure/memorysome avg10=8.42 avg60=5.11 avg300=2.03 total=1284729
full avg10=3.10 avg60=1.94 avg300=0.71 total=498210some avg10=8.42, son 10 saniye içinde en az bir görevin bellek beklerken zamanın yüzde 8.42'sinde duraklatıldığı anlamına gelir. full, boşta olmayan tüm görevlerin duraklatıldığı süreyi sayar; dolayısıyla sürekli bir full değeri, bir uyarı işaretinden ziyade ölçülebilir bir hasardır. Eğer bu dosya mevcut değilse, çekirdeğinizde PSI varsayılan olarak devre dışıdır ve çekirdek komut satırında psi=1 parametresine ihtiyaç duyar.
Hangi süreçlerin swap alanında sayfa tuttuğunu görmek için:
sudo awk '/^Name:/{n=$2} /^VmSwap:/ && $2+0 > 0 {printf "%10d kB %s\n", $2, n}' /proc/[0-9]*/status | sort -rn | headOOM killer'ın (Out of Memory killer) daha önce devreye girip girmediğini anlamak için:
sudo journalctl -k --grep "Out of memory"Bir müdahale gerçekleştiğinde çıktı Out of memory: Killed process 2199 (mysqld) total-vm:1275860kB, anon-rss:129252kB, file-rss:0kB, shmem-rss:0kB, UID:114 pgtables:504kB oom_score_adj:0 gibi görünür ve aynı saniyeye ait servis günlüğünde Main process exited, code=killed, status=9/KILL ifadesi yer alır. Eğer swap alanı olmayan bir sunucuda bu satırları gördüyseniz, bir sonraki adımda denenebilecek en düşük maliyetli çözüm bir swap dosyası eklemektir.
Swap yanlış çözüm olduğunda
Swap, geçici veya düşük öncelikli bellek baskısı için zaman kazandırır. Sürekli büyüyerek sonunda sonlanan bir süreç için hiçbir işe yaramaz; üstelik makine hızlıca hata verip yeniden başlamak yerine sayfalamaya (paging) ekstra dakikalar harcadığı için bu başarısızlığı izlemeyi zorlaştırır.
Bunun yerine sürece sınır getirin. Bir systemd servisi, bir drop-in dosyası içerisinde MemoryMax= ve MemorySwapMax= parametrelerini kabul eder; uygulamayı değiştirmeden systemd ile bir servisin bellek ve CPU kullanımını sınırlama yöntemi budur. Container yapıları da bir üst seviyede aynı kontrollere sahiptir ve bunları yapılandırmak, bir Compose servisinin tüm sunucuyu tüketmesini engelleme yoludur. Her iki yöntem de çekirdeğin puanlama sistemine göre bir kurban seçmesine izin vermek yerine, loglarda bulabileceğiniz bir isimle süreci sonlandırmanızı sağlar.
Bu işlemleri sunucu yeniyken ve sistem boşken yapın. Bir swap dosyası oluşturmak ve bellek sınırı belirlemek birkaç dakika sürer; bu işlemler yeni bir VPS üzerindeki ilk on dakika içerisinde yapılması gereken diğer işlerin bir parçasıdır.
FAQ
Swap eklemek 1 GB VPS'imi 2 GB VPS gibi çalıştırır mı?
Hayır. Swap, RAM'den çok daha yavaştır ve çekirdek yalnızca soğuk olarak değerlendirdiği sayfaları buraya taşır. Swap, ani yük artışları için bir alan sağlar ve ayrılmış ancak kullanılmayan bellek bloklarını tutar. Eğer iş yükünüz makinenin fiziksel RAM kapasitesinden daha fazla belleği aktif olarak okuyup yazıyorsa, swap kullanımı bellek yetersizliği (OOM) hatasını engellemek yerine sürekli disk üzerinde sayfalama (paging) yapılmasına neden olur; sunucu çalışmaya devam eder ancak yanıt veremeyecek kadar yavaşlar. Bu durumda RAM miktarını artırmalı veya bellek tüketen süreci sınırlandırmalısınız.
1 GB veya 2 GB VPS için ne kadar swap gerekir?
2 GB her iki durum için de yeterlidir ve RAM miktarı arttıkça bu değerin artırılmasına gerek yoktur. Swap, soğuk anonim sayfaları tutar ve bir sunucudaki gerçek anlamda soğuk bellek miktarı, toplam RAM miktarıyla aynı oranda büyümez. RAM'in iki katı kadar swap alanı ayrılmasına dair eski kural, tüm bellek görüntüsünün diske yazıldığı hazırda bekletme (hibernation) modundan gelir; VPS'ler ise asla hazırda bekletme moduna girmez. 4 GB üzerinde bir alan ayırmak, genellikle diğer kullanıcılarla paylaştığınız depolama biriminde daha uzun ve yavaş bir çöküş süreci yaşamanıza neden olur.
vm.swappiness değerini 0 yapmak swap kullanımını durdurmanın doğru yolu mudur?
Hayır, bu ayar isminin çağrıştırdığı işi yapmaz. vm.swappiness = 0 swap'i devre dışı bırakmaz. Çekirdeğe, bellek neredeyse tamamen dolana kadar anonim sayfaları geri kazanmaktan kaçınmasını söyler; bu da OOM (Out of Memory) hatası riskini azaltmak yerine artırır. Ayrıca tüm geri kazanım yükünü sayfa önbelleğine (page cache) yıkar, bu da dosya okuma işlemlerinin daha sık diske gitmesine yol açar. Eğer hiç swap istemiyorsanız sudo swapoff -a komutunu çalıştırın ve fstab dosyasındaki ilgili satırı kaldırın. Eğer daha az swap kullanımı istiyorsanız vm.swappiness = 10 değerini deneyin ve değişiklik öncesi/sonrası vmstat çıktısındaki si ve so sütunlarını karşılaştırın.
Swap dosyası yerine zram kullanmalı mıyım?
CPU kapasiteniz uygunsa ve disk alanınız kısıtlıysa zram; tam tersi durumda ise swap dosyası kullanın. zram, sayfaları sıkıştırarak RAM'de tutar; böylece disk G/Ç işlemlerinden kaçınır ancak her sayfa giriş/çıkışında CPU maliyeti oluşturur ve kapladığı alan uygulamaların kullanamayacağı RAM'den düşer. CPU limitleri düşük bir VPS'te bu maliyet, zaten kısıtlı olan kaynağınızı daha da zorlar. Her ikisini birlikte kullanmak yaygındır: /etc/default/zramswap içerisinde PRIORITY ile zram'e daha yüksek öncelik verin ve taşmalar için altta bir disk swap dosyası tutun.
free komutu bellek olduğunu gösterirken neden OOM killer çalıştı?
free komutu anlık bir durumu raporlar, ancak bellek tahsisi bir anda gerçekleşir. Geri kazanım süreci belleği boşaltamadan büyük bir bellek bloğu talep eden bir süreç, ortalama değerler uygun görünse bile sonlandırılır. Sonlandırılan süreci ve o anki bellek kullanımını görmek için sudo journalctl -k --grep "Out of memory" ile çekirdek günlüklerini inceleyin. Eğer sonlandırma tüm makineden değil de bir cgroup limitinden kaynaklanıyorsa, MemoryMax= ayarı yapılmış bir container veya systemd birimi, ana makinede boş bellek olsa bile kendi limiti dolduğu için sonlandırılmış olabilir.