Merhaba arkadaşlar, bugün sizlere özellikle yoğun trafiğe sahip sunucularınızda Memcached performansını nasıl artırabileceğinizi, multi-threading (çoklu iş parçacığı) özelliğini nasıl aktif edeceğinizi ve yüksek bağlantı sayılarına nasıl hazırlıklı olacağınızı adım adım anlatacağım. Bu optimizasyonlar, önbellek erişim gecikmelerinizi (latency) düşürüp, sunucu kaynaklarınızı daha verimli kullanmanızı sağlayacak.
Memcached Multi-Threading Nedir?
Varsayılan olarak Memcached, tek iş parçacığı (single-thread) ile çalışır. Bu, aynı anda tek bir işlem yapabildiği anlamına gelir. Modern çok çekirdekli sunucularda bu durum, CPU'nuzun büyük bir kısmının atıl kalmasına neden olur. Multi-threading özelliği, Memcached'in birden fazla iş parçacığı kullanarak eşzamanlı işlem yapabilmesini, böylece CPU çekirdeklerinizi tam kapasiteyle değerlendirmesini sağlar. Bu, özellikle saniyede binlerce istek alan sistemler için kritik bir performans artışı demektir.
Multi-Threading Nasıl Aktif Edilir?
Bu özellik, Memcached 1.5.x ve sonraki sürümlerinde mevcuttur. Öncelikle sürümünüzü kontrol edin. Aktif etmek için Memcached servisini başlatan komutu veya systemd unit dosyasını değiştirmeniz gerekir.
Benim sunucularda genelde systemd kullandığım için, unit dosyasını düzenliyorum. Aşağıdaki komutla dosyayı düzenlemek için açalım:
Karşınıza çıkacak olan dosyada, `ExecStart` satırını bulun. Varsayılan hali şuna benzer:
Bu satırın sonuna multi-threading parametrelerini ekleyeceğiz. Benim önerim, sunucunuzdaki fiziksel CPU çekirdek sayısı kadar thread kullanmanız. Çekirdek sayınızı öğrenmek için:
Diyelim ki 8 çekirdek çıktı. O zaman `ExecStart` satırını aşağıdaki gibi güncelliyoruz:
Buradaki `-t 8` parametresi, Memcached'in 8 iş parçacığı kullanacağını belirtir. Ayrıca `-m 4096` ile belleği 4GB'a, `-c 8192` ile de maksimum eşzamanlı bağlantı limitini artırdığıma dikkat edin. Bu değerleri kendi sunucu kaynaklarınıza göre ayarlamalısınız.
Değişiklikten sonra servisi yeniden başlatmayı unutmayın:
Yüksek Bağlantı Sayıları için Optimizasyon
Multi-threading aktif olsa bile, işletim sistemi seviyesinde yapılması gereken bazı ayarlar var. Aksi takdirde "Cannot assign requested address" veya bağlantı kuyruğu dolması gibi hatalarla karşılaşabilirsiniz.
İlk olarak, Linux'un bir seferde izin verdiği dosya tanımlayıcı (file descriptor) limitini artıralım. Bu limit, Memcached'in aynı anda yönetebileceği bağlantı sayısını doğrudan etkiler.
Dosyanın sonuna aşağıdaki satırları ekleyin:
İkinci önemli nokta, Linux TCP/IP yığını ayarları. Özellikle `net.core.somaxconn` değeri, bağlantı kabul kuyruğunun boyutunu belirler. Bu değeri artırmak, ani trafik patlamalarında bağlantı kayıplarını önler.
Dosyanın sonuna aşağıdaki satırları ekleyin:
Değişiklikleri uygulamak için:
Dikkat Edilmesi Gerekenler
Şu ayara çok dikkat etmelisiniz: `-l` parametresi (bağlanılacak IP adresi). Yukarıdaki örneklerde `127.0.0.1` kullandık, yani sadece localhost'tan bağlantı kabul ediyor. Eğer Memcached'i ağ üzerinden erişilebilir yapacaksanız (ki genelde önermem, güvenlik için), sunucunun iç IP'sini belirtmeli veya `0.0.0.0` kullanarak tüm arayüzleri dinlemelisiniz. Ancak bu durumda mutlaka güvenlik duvarınızla (iptables/ufw) erişimi kısıtlamalısınız.
Ayrıca, `-m` ile belirlediğiniz bellek miktarı, sunucunuzdaki boş RAM'in %80'ini geçmemeli. Swap kullanımı Memcached performansını öldürür.
Performans Testi ve Monitorizasyon
Ayarlarınızı yaptıktan sonra her şeyin yolunda gittiğinden emin olun. Memcached istatistiklerini kontrol etmek için:
Çıktıda `threads` satırını arayın. Değerin sizin belirlediğiniz thread sayısını (örneğimizde 8) göstermesi gerekir. Ayrıca `curr_connections` değerini de gözlemleyerek bağlantı yükünüzü takip edebilirsiniz.
Sonuç olarak, bu optimizasyonlar özellikle WordPress, XenForo, Magento gibi yoğun veritabanı sorguları çalıştıran ve Memcached'i aktif olarak kullanan sistemlerde gözle görülür bir iyileşme sağlayacaktır. CPU kullanımınız daha dengeli dağılacak ve sunucunuz daha fazla eşzamanlı kullanıcıyı sorunsuz karşılayabilecektir.
Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir thread sayısı veya özel bir parametre kullanan var mı? Ya da bu ayarları yaptıktan sonra performans artışını gözlemleyen? Deneyimlerinizi ve sorularınızı aşağıya yazmaktan çekinmeyin. Hep birlikte öğrenelim!
Varsayılan olarak Memcached, tek iş parçacığı (single-thread) ile çalışır. Bu, aynı anda tek bir işlem yapabildiği anlamına gelir. Modern çok çekirdekli sunucularda bu durum, CPU'nuzun büyük bir kısmının atıl kalmasına neden olur. Multi-threading özelliği, Memcached'in birden fazla iş parçacığı kullanarak eşzamanlı işlem yapabilmesini, böylece CPU çekirdeklerinizi tam kapasiteyle değerlendirmesini sağlar. Bu, özellikle saniyede binlerce istek alan sistemler için kritik bir performans artışı demektir.
Bu özellik, Memcached 1.5.x ve sonraki sürümlerinde mevcuttur. Öncelikle sürümünüzü kontrol edin. Aktif etmek için Memcached servisini başlatan komutu veya systemd unit dosyasını değiştirmeniz gerekir.
Benim sunucularda genelde systemd kullandığım için, unit dosyasını düzenliyorum. Aşağıdaki komutla dosyayı düzenlemek için açalım:
Bash:
sudo systemctl edit --full memcached.service
Karşınıza çıkacak olan dosyada, `ExecStart` satırını bulun. Varsayılan hali şuna benzer:
Bash:
ExecStart=/usr/bin/memcached -u memcache -p 11211 -m 64 -c 1024 -l 127.0.0.1
Bu satırın sonuna multi-threading parametrelerini ekleyeceğiz. Benim önerim, sunucunuzdaki fiziksel CPU çekirdek sayısı kadar thread kullanmanız. Çekirdek sayınızı öğrenmek için:
Bash:
nproc
Diyelim ki 8 çekirdek çıktı. O zaman `ExecStart` satırını aşağıdaki gibi güncelliyoruz:
Bash:
ExecStart=/usr/bin/memcached -u memcache -p 11211 -m 4096 -c 8192 -l 127.0.0.1 -t 8
Buradaki `-t 8` parametresi, Memcached'in 8 iş parçacığı kullanacağını belirtir. Ayrıca `-m 4096` ile belleği 4GB'a, `-c 8192` ile de maksimum eşzamanlı bağlantı limitini artırdığıma dikkat edin. Bu değerleri kendi sunucu kaynaklarınıza göre ayarlamalısınız.
Değişiklikten sonra servisi yeniden başlatmayı unutmayın:
Bash:
sudo systemctl daemon-reload
sudo systemctl restart memcached
Multi-threading aktif olsa bile, işletim sistemi seviyesinde yapılması gereken bazı ayarlar var. Aksi takdirde "Cannot assign requested address" veya bağlantı kuyruğu dolması gibi hatalarla karşılaşabilirsiniz.
İlk olarak, Linux'un bir seferde izin verdiği dosya tanımlayıcı (file descriptor) limitini artıralım. Bu limit, Memcached'in aynı anda yönetebileceği bağlantı sayısını doğrudan etkiler.
Bash:
sudo nano /etc/security/limits.conf
Dosyanın sonuna aşağıdaki satırları ekleyin:
Kod:
soft nofile 65536
hard nofile 131072
memcache soft nofile 65536
memcache hard nofile 131072
İkinci önemli nokta, Linux TCP/IP yığını ayarları. Özellikle `net.core.somaxconn` değeri, bağlantı kabul kuyruğunun boyutunu belirler. Bu değeri artırmak, ani trafik patlamalarında bağlantı kayıplarını önler.
Bash:
sudo nano /etc/sysctl.conf
Dosyanın sonuna aşağıdaki satırları ekleyin:
NGINX:
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 4096
net.core.netdev_max_backlog = 4096
Değişiklikleri uygulamak için:
Bash:
sudo sysctl -p
Şu ayara çok dikkat etmelisiniz: `-l` parametresi (bağlanılacak IP adresi). Yukarıdaki örneklerde `127.0.0.1` kullandık, yani sadece localhost'tan bağlantı kabul ediyor. Eğer Memcached'i ağ üzerinden erişilebilir yapacaksanız (ki genelde önermem, güvenlik için), sunucunun iç IP'sini belirtmeli veya `0.0.0.0` kullanarak tüm arayüzleri dinlemelisiniz. Ancak bu durumda mutlaka güvenlik duvarınızla (iptables/ufw) erişimi kısıtlamalısınız.
Ayrıca, `-m` ile belirlediğiniz bellek miktarı, sunucunuzdaki boş RAM'in %80'ini geçmemeli. Swap kullanımı Memcached performansını öldürür.
Ayarlarınızı yaptıktan sonra her şeyin yolunda gittiğinden emin olun. Memcached istatistiklerini kontrol etmek için:
Bash:
echo stats | nc 127.0.0.1 11211
Çıktıda `threads` satırını arayın. Değerin sizin belirlediğiniz thread sayısını (örneğimizde 8) göstermesi gerekir. Ayrıca `curr_connections` değerini de gözlemleyerek bağlantı yükünüzü takip edebilirsiniz.
Sonuç olarak, bu optimizasyonlar özellikle WordPress, XenForo, Magento gibi yoğun veritabanı sorguları çalıştıran ve Memcached'i aktif olarak kullanan sistemlerde gözle görülür bir iyileşme sağlayacaktır. CPU kullanımınız daha dengeli dağılacak ve sunucunuz daha fazla eşzamanlı kullanıcıyı sorunsuz karşılayabilecektir.
Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir thread sayısı veya özel bir parametre kullanan var mı? Ya da bu ayarları yaptıktan sonra performans artışını gözlemleyen? Deneyimlerinizi ve sorularınızı aşağıya yazmaktan çekinmeyin. Hep birlikte öğrenelim!