Zabbix Performans Optimizasyonu ve Ölçeklendirme
Yıllarca Zabbix kurulumu yapıp “şimdi izliyoruz, harika” deyip geçtikten sonra öğreniyorsunuz: asıl iş kurulumdan sonra başlıyor. Ortam büyüdükçe, host sayısı arttıkça, veri saklama süreleri uzadıkça Zabbix’in altında inlemeye başladığını görüyorsunuz. Trigger’lar geç ateşleniyor, grafikler yüklenmiyor, history tablosu kontrol dışı büyüyor. Bu yazıda sıfırdan kurulumu değil, çalışan bir Zabbix ortamını nasıl performanslı hale getirip nasıl ölçeklendireceğinizi konuşacağız.
Sorunun Kökü: Neden Zabbix Yavaşlar?
Genellikle iki temel sebep var. Birincisi veritabanı, ikincisi yanlış yapılandırılmış poller ayarları. Ama iş bununla sınırlı kalmıyor. Şöyle düşünün: 500 host, her birinde 50 item, 5 saniyede bir toplama. Saniyede 5000 değer yazıyorsunuz veritabanına. Bir yıl boyunca bu değerleri tutmaya çalışırsanız history tablosu milyarlarca satıra ulaşıyor. MySQL ya da PostgreSQL bu yükü kaldırmak zorunda kalıyor.
Sorunun tipik belirtileri şunlar:
- Zabbix Server log dosyasında “zabbix_server busy” uyarıları
- Slow query log‘da sık görünen history ve trends sorguları
- Frontend’de grafik yüklenirken timeout
- Trigger hesaplamalarında 30-60 saniyeye varan gecikmeler
zabbix_server -R config_cache_reloadkomutunun uzun sürmesi
Bunları görüyorsanız doğru yerdesiniz.
Veritabanı Tarafını Düzeltmek
InnoDB Ayarları (MySQL/MariaDB)
Zabbix varsayılan bir MySQL kurulumunu kolayca bunaltır. /etc/mysql/conf.d/zabbix.cnf veya /etc/my.cnf.d/zabbix.cnf dosyasına şunları ekleyin:
[mysqld]
innodb_buffer_pool_size = 8G # RAM'in %70-80'i
innodb_buffer_pool_instances = 8 # buffer_pool_size / 1GB
innodb_log_file_size = 1G
innodb_log_buffer_size = 256M
innodb_flush_log_at_trx_commit = 2 # Veri kaybı riski az, performans yüksek
innodb_flush_method = O_DIRECT
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
max_connections = 300
tmp_table_size = 256M
max_heap_table_size = 256M
innodb_flush_log_at_trx_commit = 2 ayarı hakkında küçük bir not: bu değer 0 veya 2 yapıldığında sistem çökmesinde son 1 saniyelik veri kaybedilebilir. Monitoring verisi için bu genellikle kabul edilebilir. Bankacılık sistemi izlemiyorsunuz, saniyenin transaction verilerini değil.
Partitioning ile History Tablosunu Kontrol Altına Almak
Zabbix’in en ağır tabloları history, history_uint, history_str, history_text, history_log ve trends tablolarıdır. Housekeeping süreci bu tablolardan veri silerken tablo lock’larına neden olabilir. Bunun çözümü partition kullanmak.
Önce mevcut durumu kontrol edin:
mysql -u zabbix -p zabbix -e "
SELECT table_name,
ROUND(data_length/1024/1024/1024, 2) AS data_GB,
ROUND(index_length/1024/1024/1024, 2) AS index_GB,
table_rows
FROM information_schema.tables
WHERE table_schema = 'zabbix'
ORDER BY data_length DESC LIMIT 10;"
Eğer history_uint tablosu 50GB’ı geçmişse artık partition olmadan hayat zor. Zabbix’in kendi housekeeping’ini devre dışı bırakıp manuel partition yönetimi yapan script’leri devreye alın. Toplulukta yaygın kullanılan partition script’i şöyle çalışır:
# Partition var mı kontrol et
mysql -u zabbix -p zabbix -e "
SELECT partition_name, partition_description
FROM information_schema.partitions
WHERE table_name = 'history_uint'
AND table_schema = 'zabbix'
ORDER BY partition_description DESC LIMIT 5;"
Partition script’i kurduktan sonra Zabbix frontend’inden Administration > General > Housekeeping sayfasına gidip “Enable internal housekeeping” seçeneklerini kapatın. Artık temizleme işini cron job üzerinden yönetiyorsunuz.
TimescaleDB ile PostgreSQL Üzerinde Çalışmak
Eğer greenfield bir kurulum yapıyorsanız veya taşıma kapasitesine sahipseniz PostgreSQL + TimescaleDB kombinasyonu Zabbix 5.x ve sonrası için çok iyi sonuç veriyor. TimescaleDB, zaman serisi verileri için otomatik partitioning ve compression sağlıyor.
# TimescaleDB extension kurulumu (Ubuntu/Debian)
apt install timescaledb-2-postgresql-14
# postgresql.conf'a ekle
timescaledb.max_background_workers = 8
# Zabbix DB üzerinde
psql -U zabbix zabbix -c "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;"
# Zabbix şema script'ini çalıştır
psql -U zabbix zabbix < /usr/share/doc/zabbix-server-pgsql/timescaledb.sql
TimescaleDB ile history tabloları otomatik olarak hypertable’a dönüşür ve aylık chunk’lar halinde yönetilir. Compression açıldığında disk kullanımını %70-80 oranında düşürdüğünü bizzat gördüm. 2TB olan bir history verisi 400GB’a indi.
Zabbix Server Yapılandırması
/etc/zabbix/zabbix_server.conf dosyası varsayılan değerlerle gelir ve bu değerler küçük ortamlar için bile yetersiz kalabilir.
# Temel process sayıları
StartPollers=80
StartIPMIPollers=5
StartPollersUnreachable=15
StartTrappers=10
StartPingers=10
StartDiscoverers=5
StartHTTPPollers=5
StartTimers=4
StartEscalators=2
StartAlerters=10
# Önbellek ayarları
CacheSize=128M
CacheUpdateFrequency=60
StartDBSyncers=8
HistoryCacheSize=256M
HistoryIndexCacheSize=64M
TrendCacheSize=32M
ValueCacheSize=256M
# Timeout değerleri
Timeout=30
TrapperTimeout=300
# Log ayarları
LogSlowQueries=3000
Bu değerleri körü körüne kopyalamayın. Ortamınıza göre kalibre etmeniz gerekiyor. Bunun için Zabbix’in kendi iç metriklerini izleyin. Zabbix Server host’una Zabbix server health template’ini atayın ve şu metriklere bakın:
- Utilization of poller processes: Sürekli %80’in üzerindeyse
StartPollersartırın - Utilization of DB syncers: Yüksekse
StartDBSyncersartırın - History write cache used: %50’nin üzerindeyse
HistoryCacheSizeartırın - Value cache hits: Düşükse
ValueCacheSizeartırın
# Anlık process durumunu görmek için
zabbix_server -R diaginfo 2>/dev/null | head -50
Proxy Mimarisi ile Yatay Ölçekleme
Tek bir Zabbix Server ile 10.000 host izlemek mümkün ama akıllıca değil. 2000-3000 host’un üzerinde proxy mimarisine geçmeyi düşünün. Proxy’lerin avantajları:
- Network segmentasyonu (DMZ, farklı lokasyonlar, müşteri ağları)
- Server üzerindeki polling yükünün dağıtılması
- WAN bağlantısı kesildiğinde lokal buffer ile veri kaybının önlenmesi
Proxy kurulumu ve bağlanması:
# Proxy sunucusunda
apt install zabbix-proxy-mysql
# /etc/zabbix/zabbix_proxy.conf
Server=192.168.1.10 # Zabbix Server IP
Hostname=proxy-dc-istanbul
DBHost=localhost
DBName=zabbix_proxy
DBUser=zabbix
DBPassword=secretpass
ProxyMode=0 # 0=active, 1=passive
ConfigFrequency=3600
DataSenderFrequency=1
StartPollers=40
HistoryCacheSize=128M
ProxyLocalBuffer=1 # Lokal buffer tutma süresi (saat)
ProxyOfflineBuffer=24 # Offline buffer (saat)
Proxy aktif modda çalışıyorsa (ProxyMode=0) server’a bağlanır, konfigürasyonu çeker ve topladığı verileri push eder. Bu firewall açısından avantajlıdır: sadece proxy’den server’a outbound bağlantı yeterli.
Bir gerçek senaryo: İstanbul’da merkez, Ankara ve İzmir’de şube ofisleri olan bir müşteride her şubeye bir proxy koyduk. WAN hattı kesildiğinde lokaldeki cihazlar izlenmeye devam etti, hat geldiğinde biriken veri server’a otomatik olarak gönderildi. Lokal NOC ekibi de kendi şubesinin verilerini proxy üzerinden görebildi.
Frontend Performansı
Web arayüzü yavaşlığının çoğu ya veritabanı sorgularından ya da PHP konfigürasyonundan kaynaklanır.
PHP-FPM Ayarları
# /etc/php/8.1/fpm/pool.d/zabbix.conf
[zabbix]
user = www-data
group = www-data
listen = /run/php/php8.1-fpm-zabbix.sock
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
# PHP memory limiti
php_value[memory_limit] = 256M
php_value[post_max_size] = 16M
php_value[upload_max_filesize] = 2M
php_value[max_execution_time] = 300
php_value[max_input_time] = 300
Nginx Üzerinde Önbellekleme
Static asset’ler için nginx tarafında cache açmak frontend hissini iyileştirir:
# /etc/nginx/conf.d/zabbix.conf içine ekle
location ~* .(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
access_log off;
}
# Gzip sıkıştırma
gzip on;
gzip_vary on;
gzip_min_length 1000;
gzip_types text/plain text/css application/javascript application/json;
İzleme Stratejisi Optimizasyonu
Performans sorununun bir kısmı teknik değil, mimarisel. Yanlış konfigüre edilmiş item’lar sistemi gereksiz yere yorar.
Polling Aralıklarını Akıllıca Ayarlayın
Her item’ı 30 saniyede bir toplamak gerekmez. Düşük öncelikli metrikleri daha seyrek toplayın:
- CPU, Memory, Disk I/O: 60 saniye yeterli
- Network interface traffic: 60 saniye
- Disk doluluk oranı: 5 dakika (hatta 10 dakika)
- Log dosyası izleme: 10-30 saniye
- Servis durumu: 30-60 saniye
Her item’da history storage period ve trend storage period değerlerini de gözden geçirin. Tüm metrikler için 1 yıllık history tutmak zorunda değilsiniz. Debug amaçlı high-frequency item’lar için 7 gün yeterli.
Passive vs Active Agent
Büyük ortamlarda Zabbix Active Agent kullanımı server üzerindeki poller yükünü önemli ölçüde azaltır. Passive agent’ta server agent’a bağlanıp veri çeker. Active agent’ta ise agent’ın kendisi server’a bağlanıp veri gönderir. Bağlantı yönetimi agent tarafına kayar, server sadece dinler.
# /etc/zabbix/zabbix_agentd.conf
# Active agent için
ServerActive=192.168.1.10
Hostname=web-server-01
RefreshActiveChecks=120
BufferSize=1000
MaxLinesPerSecond=100
# Passive'i de bırakabilirsiniz ama büyük ortamda gerekli değil
# Server=192.168.1.10
Template Şişkinliğini Azaltın
“Şablonu aldık, hepsini çektik” sendromu çok yaygın. Bir Linux sunucusu için 200 item mi lazım? Çoğu ortamda hayır. Gereksiz item’ları disabled yapın ya da custom template oluşturun. Özellikle şunlara dikkat edin:
- Kullanılmayan network interface’lerin discovery’den çıkarılması
- Mount edilmemiş disk bölümlerinin filtreden geçirilmesi
- Gereksiz low-level discovery rule’larının kaldırılması
LLD (Low-Level Discovery) filter örneği:
# Filesystem discovery için filter - sadece ext4 ve xfs al
# Filter expression:
{#FSTYPE} MATCHES_REGEX ^(ext4|xfs)$
# Mounted olmayanları çıkar:
{#FSPATH} NOT_MATCHES_REGEX ^(tmpfs|devtmpfs|/run|/sys|/proc)
Monitoring ve Alarm Yorgunluğunu Azaltma
Bu başlık doğrudan performansla ilgili değil ama dolaylı olarak önemli. Aşırı trigger ateşlenmeleri, alarm flapping ve yanlış pozitif uyarılar hem ekibi yoruyor hem de Zabbix’in escalation ve alert mekanizmasını gereksiz yoruyor.
Trigger’larınızda hysteresis ve depends on kullanın:
# Kötü trigger - flapping'e açık
{server01:system.cpu.util.last()}>80
# İyi trigger - 5 dakika üzeri kaldıysa tetikle
{server01:system.cpu.util.min(5m)}>90
# Daha iyi - ortalama ve minimum birlikte
{server01:system.cpu.util.avg(5m)}>85 and {server01:system.cpu.util.min(5m)}>75
Ağ cihazları için “host unavailable” trigger’ına bağımlılık tanımlayın. Switch’e erişim yoksa arkasındaki 20 host’un da alarm üretmesini engelleyin.
Yük Testi ve Kapasite Planlaması
Sisteminizin ne kadar yükü kaldırabileceğini bilmeden ölçeklendirme planı yapamazsınız. Şu sorulara cevap bulun:
# Saniyedeki ortalama değer toplama hızı (NVPS)
mysql -u zabbix -p zabbix -e "
SELECT ROUND(COUNT(*) /
(UNIX_TIMESTAMP(NOW()) - MIN(clock)), 2) AS nvps
FROM history_uint
WHERE clock > UNIX_TIMESTAMP(NOW()) - 3600;"
# Cache hit oranı (Zabbix iç metriklerinden)
# zabbix[vcache,cache,hits] ve zabbix[vcache,cache,misses] item'larına bakın
Genel eşikler:
- NVPS < 1000: Tek server, varsayılan ayarlar yeterli
- NVPS 1000-5000: Sunucu ve DB optimizasyonu, SSD zorunlu
- NVPS 5000-20000: Ayrı DB sunucusu, proxy mimarisi
- NVPS > 20000: Çoklu proxy, DB clustering veya TimescaleDB şart
Zabbix 6.x ve Sonrası: Yeni Özellikler
Zabbix 6.0 LTS ile gelen bazı özellikler performansı doğrudan etkiliyor:
High Availability (HA) modu: Birden fazla Zabbix Server node’u aktif/pasif olarak çalışabilir. Failover süreleri dakikalar yerine saniyelere indi.
# İkinci node'un zabbix_server.conf'una ekle
HANodeName=zabbix-node-02
NodeAddress=192.168.1.11:10051
Preprocessing worker’ları: Item preprocessing artık ayrı process’lerde çalışıyor. Yoğun preprocessing yapılan ortamlarda StartPreprocessors değerini artırın:
StartPreprocessors=12
Sonuç
Zabbix performans optimizasyonu “bir kez yap, unut” işi değil. Ortamınız büyüdükçe, yeni sistemler eklendikçe tekrar gözden geçirmeniz gerekiyor. Şu adımları bir checklist olarak düşünebilirsiniz:
- Veritabanı buffer ve I/O ayarlarını sistem kaynaklarına göre kalibre edin
- History ve trends tablolarını partition veya TimescaleDB ile yönetin
- Zabbix Server’ın kendi health metriklerini izleyin, darboğazı data ile bulun
- 2000+ host’tan itibaren proxy mimarisini değerlendirin
- Active agent’a geçin, poller yükünü azaltın
- Template şişkinliğini temizleyin, polling aralıklarını akıllıca ayarlayın
- Trigger kalitesini artırın, alarm yorgunluğunu azaltın
En sık yapılan hata şu: sorun çıktıktan sonra çözmeye çalışmak. Zabbix’i izlerken aynı zamanda Zabbix’i izlemeniz gerekiyor. Kendi sunucunuzu da izleme kapsamına alın, kapasite eşiklerini önceden belirleyin. Sistem yöneticiliğinde sürpriz sevmeyiz.
