Merhaba arkadaşlar, bugün sizlere özellikle yoğun trafiğe sahip sunucularınızda MySQL yükünü ciddi oranda azaltan, uygulama hızınızı gözle görülür şekilde artıran Memcached'in performansını nasıl tırnak içine alacağımızı anlatacağım. Doğru ayarlanmamış bir Memcached, beklenen faydayı sağlamayacağı gibi, kaynak israfına ve hatta bağlantı sorunlarına yol açabilir. Benim sunucularda genelde uyguladığım kritik ayarları ve izleme yöntemlerini paylaşacağım.
Temel Performans Parametreleri ve Ayarları
Memcached'in performansı, başlıca üç ana parametreye bağlıdır: eşzamanlı bağlantı sayısı, bellek tahsisi ve bellek kullanım algoritması. Varsayılan ayarlar genellikle üretim ortamı için yetersiz kalır.
En kritik ayarlar, başlangıç parametrelerinde yatar. Memcached'i systemd ile yönetiyorsanız, /etc/systemd/system/memcached.service.d/override.conf dosyasını oluşturup düzenlemek en temiz yöntemdir. Ya da direkt /etc/memcached.conf dosyasını düzenleyebilirsiniz.
İşte benim yüksek trafikli sistemlerde kullandığım örnek bir başlatma parametresi:
Şimdi bu parametreleri tek tek açıklayalım:
-m 4096: Memcached'e tahsis edilecek maksimum bellek miktarıdır (MB cinsinden). Bu örnekte 4GB. Sunucunuzun fiziksel RAM'inin %70-80'ini geçmemesine, swap'e düşmemesine özen gösterin.
-c 8192: Maksimum eşzamanlı bağlantı sayısı. Varsayılanı 1024'tür ve yoğun uygulamalarda (WordPress, XenForo, özel yazılımlar) bu limit çok çabuk dolabilir. Uygulamanızın bağlantı havuzu ayarına göre bu değeri artırın. Çok yüksek tutmak da gereksiz bellek tüketimine yol açar, dikkatli olun.
-t 8: Çalışacak iş parçacığı (thread) sayısı. Genellikle sunucunuzdaki fiziksel CPU çekirdek sayısı kadar veya biraz altında tutmak idealdir. Çok fazla thread, kilitlenme (lock contention) sorunlarına neden olabilir.
-o modern: Bellek kullanım algoritmasını seçer. `modern` seçeneği, daha verimli bir slab dağıtımı sağlar ve parçalanmayı (fragmentation) azaltmaya yardımcı olur. Daha eski sürümlerde `slab_reassign, slab_automove` gibi ayrı seçenekler kullanılırdı.
Memcached'i İzleme ve Metrikleri Anlama
Ayarları yaptık, peki performansı nasıl takip edeceğiz? Memcached, `stats` komutu ile çok detaylı metrikler sunar. Bu metrikleri anlamak, sorun gidermenin ilk adımıdır.
Memcached'e telnet veya netcat ile bağlanıp `stats` komutunu çalıştıralım:
Karşınıza çıkacak metriklerden en önemlileri şunlar:
curr_connections: Anlık aktif bağlantı sayısı. `-c` parametresi ile belirlediğiniz maksimum değere yaklaşıyorsa, bağlantı limitinizi artırmanın zamanı gelmiş demektir.
cmd_get / get_hits: `get_hits / cmd_get` oranı HİT ORANINIZDIR. Bu oran mümkün olduğunca 1'e (%100'e) yakın olmalıdır. %90'ın altına düşüyorsa, cache'lenen veri boyutları çok küçük olabilir veya önbellek süreleriniz (TTL) çok kısadır.
evictions: Bellek dolduğu için önbellekten atılan öğe sayısı. Bu değer sürekli artıyorsa, `-m` ile belirlediğiniz bellek miktarı yetersiz kalıyor demektir. Belleği artırmayı veya gereksiz verileri cache'lememeyi düşünmelisiniz.
bytes: Kullanılan toplam bellek bayt cinsinden. `-m` parametresinde belirttiğiniz sınıra ne kadar yaklaştığınızı gösterir.
Kritik Uyarılar ve Optimizasyon İpuçları
Şu ayara çok dikkat etmelisiniz: Bağlantı limiti (-c). Eğer uygulamanız "cannot connect to memcached" benzeri hatalar veriyorsa, ilk bakacağınız yer burasıdır. Ayrıca, Memcached'i dinleyeceği arayüzü de kısıtlamak güvenlik için önemlidir. Sadece localhost'tan (`-l 127.0.0.1`) veya güvenli bir iç ağ IP'sinden dinlemesini sağlayın.
Bir diğer önemli nokta, uygulama tarafındaki bağlantı havuzu ayarlarıdır. Memcached sunucusunda yüksek limitler belirleseniz bile, PHP veya uygulamanızın kütüphanesi (örneğin `memcached` PHP eklentisi) daha düşük bir havuz boyutu kullanıyorsa, performans darboğazı yaşanır. Bu ayarları da uygulama/config seviyesinde kontrol edin.
Son olarak, Memcached servisini değişikliklerden sonra mutlaka yeniden başlatmayı unutmayın:
Sonuç
Doğru yapılandırılmış bir Memcached, sunucu yükünüzde mucizeler yaratabilir. İşin özü, uygulamanızın trafik profilini anlamak ve `-c` (bağlantı), `-m` (bellek) parametrelerini buna göre, `stats` komutu ile sürekli izleyerek ayarlamaktır.
Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı kullandığınız parametreler veya izleme araçları var mı? Ya da takıldığınız bir nokta olursa, aşağıya yazmaktan çekinmeyin. Hep birlikte tartışıp öğrenelim.
Memcached'in performansı, başlıca üç ana parametreye bağlıdır: eşzamanlı bağlantı sayısı, bellek tahsisi ve bellek kullanım algoritması. Varsayılan ayarlar genellikle üretim ortamı için yetersiz kalır.
En kritik ayarlar, başlangıç parametrelerinde yatar. Memcached'i systemd ile yönetiyorsanız, /etc/systemd/system/memcached.service.d/override.conf dosyasını oluşturup düzenlemek en temiz yöntemdir. Ya da direkt /etc/memcached.conf dosyasını düzenleyebilirsiniz.
İşte benim yüksek trafikli sistemlerde kullandığım örnek bir başlatma parametresi:
Bash:
# /etc/memcached.conf veya systemd override'ında kullanılacak parametreler
-p 11211
-U 0
-m 4096
-c 8192
-t 8
-o modern
Şimdi bu parametreleri tek tek açıklayalım:
-m 4096: Memcached'e tahsis edilecek maksimum bellek miktarıdır (MB cinsinden). Bu örnekte 4GB. Sunucunuzun fiziksel RAM'inin %70-80'ini geçmemesine, swap'e düşmemesine özen gösterin.
-c 8192: Maksimum eşzamanlı bağlantı sayısı. Varsayılanı 1024'tür ve yoğun uygulamalarda (WordPress, XenForo, özel yazılımlar) bu limit çok çabuk dolabilir. Uygulamanızın bağlantı havuzu ayarına göre bu değeri artırın. Çok yüksek tutmak da gereksiz bellek tüketimine yol açar, dikkatli olun.
-t 8: Çalışacak iş parçacığı (thread) sayısı. Genellikle sunucunuzdaki fiziksel CPU çekirdek sayısı kadar veya biraz altında tutmak idealdir. Çok fazla thread, kilitlenme (lock contention) sorunlarına neden olabilir.
-o modern: Bellek kullanım algoritmasını seçer. `modern` seçeneği, daha verimli bir slab dağıtımı sağlar ve parçalanmayı (fragmentation) azaltmaya yardımcı olur. Daha eski sürümlerde `slab_reassign, slab_automove` gibi ayrı seçenekler kullanılırdı.
Ayarları yaptık, peki performansı nasıl takip edeceğiz? Memcached, `stats` komutu ile çok detaylı metrikler sunar. Bu metrikleri anlamak, sorun gidermenin ilk adımıdır.
Memcached'e telnet veya netcat ile bağlanıp `stats` komutunu çalıştıralım:
Bash:
echo "stats" | nc localhost 11211
Karşınıza çıkacak metriklerden en önemlileri şunlar:
curr_connections: Anlık aktif bağlantı sayısı. `-c` parametresi ile belirlediğiniz maksimum değere yaklaşıyorsa, bağlantı limitinizi artırmanın zamanı gelmiş demektir.
cmd_get / get_hits: `get_hits / cmd_get` oranı HİT ORANINIZDIR. Bu oran mümkün olduğunca 1'e (%100'e) yakın olmalıdır. %90'ın altına düşüyorsa, cache'lenen veri boyutları çok küçük olabilir veya önbellek süreleriniz (TTL) çok kısadır.
evictions: Bellek dolduğu için önbellekten atılan öğe sayısı. Bu değer sürekli artıyorsa, `-m` ile belirlediğiniz bellek miktarı yetersiz kalıyor demektir. Belleği artırmayı veya gereksiz verileri cache'lememeyi düşünmelisiniz.
bytes: Kullanılan toplam bellek bayt cinsinden. `-m` parametresinde belirttiğiniz sınıra ne kadar yaklaştığınızı gösterir.
Şu ayara çok dikkat etmelisiniz: Bağlantı limiti (-c). Eğer uygulamanız "cannot connect to memcached" benzeri hatalar veriyorsa, ilk bakacağınız yer burasıdır. Ayrıca, Memcached'i dinleyeceği arayüzü de kısıtlamak güvenlik için önemlidir. Sadece localhost'tan (`-l 127.0.0.1`) veya güvenli bir iç ağ IP'sinden dinlemesini sağlayın.
Bir diğer önemli nokta, uygulama tarafındaki bağlantı havuzu ayarlarıdır. Memcached sunucusunda yüksek limitler belirleseniz bile, PHP veya uygulamanızın kütüphanesi (örneğin `memcached` PHP eklentisi) daha düşük bir havuz boyutu kullanıyorsa, performans darboğazı yaşanır. Bu ayarları da uygulama/config seviyesinde kontrol edin.
Son olarak, Memcached servisini değişikliklerden sonra mutlaka yeniden başlatmayı unutmayın:
Bash:
sudo systemctl restart memcached
# Ayarların doğru yüklendiğinden emin olun
sudo systemctl status memcached
Doğru yapılandırılmış bir Memcached, sunucu yükünüzde mucizeler yaratabilir. İşin özü, uygulamanızın trafik profilini anlamak ve `-c` (bağlantı), `-m` (bellek) parametrelerini buna göre, `stats` komutu ile sürekli izleyerek ayarlamaktır.
Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı kullandığınız parametreler veya izleme araçları var mı? Ya da takıldığınız bir nokta olursa, aşağıya yazmaktan çekinmeyin. Hep birlikte tartışıp öğrenelim.