Linux Ubuntu kswapd0 Yüksek CPU Kullanımı

Özgün – Dev

Bu sabah Digital Ocean'da barındırdığımız bir test sunucumuzdaki bir websiteye giriş yapılamadığını fark ettim. Kısa bir incelemenin ardından 50-60 bandında cpu'nun kswapd0 adlı bir işlem tarafından kullanıldığını gördüm.

Sucunumuzda daha önceden de bu durumla karşılaşmıştık fakat reboot sonrası çözüldüğü için geçici olduğunu düşünmüştüm. Bu sabah öyle olmadığına karar verince ilk iş sunucu belleğinin nasıl kullanıldığını öğrenmek oldu.

Bunun için sunucuda kullanabileceğim "top" komutunu öğrendim. Bu komutun çıktısında gördüğüm üzere kswapd0 adlı bir işlem yüksek oranda cpu kullanıyor ve yukardaki panelde de görüldüğü gibi 100% cpu kullanımı sonucunda web serverı kullanmak dahil bir işlem yapılamıyordu.

$ top

Bir süre araştırdıktan sonra kswapd0 adlı işlemin belleğin yetersiz kaldığı durumlarda devreye girdiğini ve swapping denen bir işlemi gerçekleştirdiğini öğrendim. Basitçe anladığım kadarıyla belleğin zorlandığı durumlarda RAM'i kullanmak yerine fiziksel disk'i kullanan bir sistem. Kswapd0 işlemi de bu sanal belleği yönetiyor.

Kswapd0 bir virüs mü?

Araştırmalarımdan öğrendiğim kadarıyla yüksek ihtimalle kswapd0 ile alakalı virüssel ve kötü amaçlı yazılımsal bir durum yok. Yine de bazı yorumlarda .rsync veya .configrc gibi kullanıcı dosyalarının arasında a/ adında bir klasörün içinde bulunması durumunda bir crypto miner olabileceğinden bahsedilmiş. Aşağıdaki komutu kullanarak veya manuel olarak bir kontrol etmenizde fayda var.

$ sudo find /home kswapd0

Kswapd0 dolayısıyla yüksek cpu nasıl çözülür?

Bizim durumumuzda bir sızma söz konusu değilmiş. Bu yüzden bu swap işleminin nasıl gerçekleştiğini irdelemeye devam ettim ve swap sisteminin kontrol eden bir değer olan swappiness ile swap space denen kavramlara ulaştım. Swappiness değeri sistemin ne zaman bu işlemi gerçekleştireceğini belirlerken, swap space belirlenen bir dosya üzerinden bu sistemin ne kadar boyutta olacağı ile alakalı. Bu noktada uygulayabileceğim bir rehberi yine Digital Ocean üzerinden buldum. Yazının devamında swap space oluştururken izleyeceğim adımlar ve komutlar oradan alınmadır.

Swap space oluşturmak

Önce sistemimizde zaten swap ayarlarının yapılmadığını kontrol etmek için aşağıdaki komutu kullanıyoruz. Eğer hiçbir çıktı almazsak ayarımız yapılmamış demektir.

$ sudo swapon --show

Daha sonra aşağıdaki komutla sistemimizde swap için kullanabileceğimiz diskteki boş alanımızı kontrol ediyoruz.

$ df -h

Mounted on sütununda / ile işaretli kısım diskimiz. Kullanacağımız swap space boyutu kişisel tercihimize veya uygulamamızın ihtiyacına göre değişebilirmiş. Sistemimizdeki RAM miktarı veya iki katı kadar güzel bir başlangıç noktası olabilir.

Şimdi aşağıdaki komutları kullanarak 1gb boyutunda bir swap dosyası oluşturup, yalnızca root kullanıcıya okuma ve yazma izni veriyoruz.

$ sudo fallocate -l 1G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile

Aşağıdaki gibi bir çıktı aldığımızda swap dosyamız etkinleşmiş demektir.

$ sudo swapon --show

Çıktı: 
NAME      TYPE  SIZE USED PRIO
/swapfile file 1024M   0B   -2

Yaptığımız değişikliklerin kalıcı olması için aşağıdaki komutları kullanarak önce yedek alarak ayarlarımızı kaydediyoruz.

$ sudo cp /etc/fstab /etc/fstab.bak
$ echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Swappiness değerini güncellemek

0-100 arasında ayarlanabilen bu değişken 0'a ne kadar yaklaşırsa diske kesinlikle gerekmediği müddetçe data yazmayacak. Swap dosyasıyla interaksiyona girmek daha ağır bir işlem olduğu için swap'ın pek fazla kullanılmamasın sistemi daha fazla hızlandıracağı söyleniyor. Default değeri 60 olan bu değişkenin sunucular için 0'a yaklaştırılabilirmiş. Kalıcı olarak swap değerimizi aşağıdaki gibi değiştirebiliriz:

$ sudo nano /etc/sysctl.conf

// En aşağıya ekliyoruz
vm.swappiness=10
vm.vfs_cache_pressure=50

Cache pressure ise tavsiye edilen bir başka değer. Bu değişiklikleri yaptıktan sonra reboot atıyoruz. Reboot atmadan geçerli sessionda da değerleri aşağıdaki komutlarla güncellemek mümkün.

$ sudo sysctl vm.swappiness=10
$ sudo sysctl vm.vfs_cache_pressure=50

Mysql yüksek bellek kullanımı

Swap ayarlarını tamamladığımda kswapd0'nın yüksek kullanımı çözülmüş oldu. Fakat bu sorunu incelerken mysql programının da nispeten yüksek bellek kullandığını gördüm.

Hızlı bir araştırma sonucu yarı yarıya iyileşme sağlayan RAM miktarı düşük sunucularda uygulanabilecek performance schema özelliğini kapatan şu ayarlara ulaştım:

$ nano /etc/mysql/my.cnf

// En sona ekliyoruz
[mysqld]

performance_schema = OFF

Bununla birlikte sunucumuzdaki değerler normale döndü.

Umarım o şekilde kalır :)