Neden profil bazlı ayar?
MariaDB’nin performansı; RAM, CPU çekirdek sayısı, disk I/O hızı ve iş yükü karakteri (okuma-yazma oranı, kısa/uzun işlemler, eşzamanlı bağlantı sayısı) ile belirlenir. Aşağıdaki profillerde hedefimiz:
- Okuma/yazma hızını artırmak
- Bellek kullanımını dengelemek
- Disk I/O’yu azaltmak
- Yüksek eşzamanlılıkta ölçeklenmek
Not: Değerler başlangıç noktasıdır. Canlı sistemde metrikleri izleyip ince ayar yapmanı öneririm.
Genel İlkeler (Tüm Profiller İçin)
- InnoDB kullan: (MyISAM yerine) ACID, MVCC, tampon havuzu → tutarlı yüksek performans.
- SSD/NVMe varsayımı: innodb_flush_method=O_DIRECT, innodb_flush_neighbors=0
- Adanmış DB sunucusu: RAM’in %70–80’i innodb_buffer_pool_size için ayrılır.
- Query Cache kapalı: Yüksek yazma/çok çekirdekli sistemlerde ölçeklenmeyi bozar.
- Bağlantı havuzu: Uygulama tarafında (örn. PHP-FPM, JVM pool) mutlaka kullan.
- Durabilite tercihi: En yüksek hız için innodb_flush_log_at_trx_commit=2 + sync_binlog=0 (küçük bir veri kaybı penceresini göze alır). Tam dayanıklılık istersen 1 ve 1.
Konfigürasyon Dosyası Konumu
Ubuntu için tipik yol:
- Ana dosya: /etc/mysql/mariadb.conf.d/50-server.cnf (Bazı sistemlerde my.cnf veya 50-mysqld_safe.cnf de olabilir.)
Aşağıdaki blokları, ilgili dosyada [mysqld] bölümüne ekleyebilirsin.
Profil 1 — 4 vCPU / 8 GB RAM (4C/8G)
Hedef: Orta eşzamanlılık, web/raporlama karışık yük.
[mysqld]
# Depolama & Bellek
default_storage_engine=InnoDB
innodb_buffer_pool_size=5G
innodb_buffer_pool_instances=4
innodb_log_file_size=512M
innodb_log_files_in_group=2
innodb_log_buffer_size=128M
innodb_flush_method=O_DIRECT
innodb_flush_neighbors=0
# I/O & İş parçacıkları
innodb_io_capacity=800
innodb_io_capacity_max=1600
innodb_read_io_threads=4
innodb_write_io_threads=4
innodb_page_cleaners=4
# Dayanıklılık / Performans
innodb_flush_log_at_trx_commit=2 # 1 = en güvenli, 2 = performans tercih
sync_binlog=0 # repl yoksa 0, varsa 1 önerilir
# Bağlantılar & Önbellekler
max_connections=300
thread_cache_size=100
thread_handling=pool-of-threads
table_open_cache=2000
table_open_cache_instances=8
table_definition_cache=2000
open_files_limit=65535
skip_name_resolve=ON
# Geçici tablolar / sıralama (her bağlantı için ayrılır: dikkatli artır)
tmp_table_size=64M
max_heap_table_size=64M
sort_buffer_size=2M
join_buffer_size=2M
# Diğer
max_allowed_packet=64M
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
# Query Cache KAPALI
query_cache_type=0
query_cache_size=0
Profil 2 — 8 vCPU / 16 GB RAM (8C/16G)
Hedef: Daha yüksek eşzamanlılık, yoğun okuma + periyodik yazma.
[mysqld]
default_storage_engine=InnoDB
innodb_buffer_pool_size=12G
innodb_buffer_pool_instances=8
innodb_log_file_size=1G
innodb_log_files_in_group=2
innodb_log_buffer_size=256M
innodb_flush_method=O_DIRECT
innodb_flush_neighbors=0
innodb_io_capacity=2000
innodb_io_capacity_max=4000
innodb_read_io_threads=6
innodb_write_io_threads=6
innodb_page_cleaners=8
innodb_flush_log_at_trx_commit=2
sync_binlog=0
max_connections=500
thread_cache_size=200
thread_handling=pool-of-threads
table_open_cache=4000
table_open_cache_instances=8
table_definition_cache=4000
open_files_limit=100000
skip_name_resolve=ON
tmp_table_size=128M
max_heap_table_size=128M
sort_buffer_size=4M
join_buffer_size=4M
max_allowed_packet=128M
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
query_cache_type=0
query_cache_size=0
Profil 3 — 16 vCPU / 32 GB RAM (16C/32G)
Hedef: Yüksek eşzamanlılık, karışık OLTP + analitik, daha büyük veri seti.
[mysqld]
default_storage_engine=InnoDB
innodb_buffer_pool_size=24G
innodb_buffer_pool_instances=12
innodb_log_file_size=2G
innodb_log_files_in_group=2
innodb_log_buffer_size=512M
innodb_flush_method=O_DIRECT
innodb_flush_neighbors=0
innodb_io_capacity=4000
innodb_io_capacity_max=8000
innodb_read_io_threads=8
innodb_write_io_threads=8
innodb_page_cleaners=12
innodb_flush_log_at_trx_commit=2
sync_binlog=0
max_connections=800
thread_cache_size=400
thread_handling=pool-of-threads
table_open_cache=8000
table_open_cache_instances=16
table_definition_cache=8000
open_files_limit=200000
skip_name_resolve=ON
tmp_table_size=256M
max_heap_table_size=256M
sort_buffer_size=4M
join_buffer_size=4M
max_allowed_packet=256M
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
query_cache_type=0
query_cache_size=0
Profil 4 — 32 vCPU / 64 GB RAM (32C/64G)
Hedef: Çok yüksek eşzamanlılık, yoğun yazma + büyük analitik sorgular.
[mysqld]
default_storage_engine=InnoDB
innodb_buffer_pool_size=48G
innodb_buffer_pool_instances=16
innodb_log_file_size=4G # FS sınırlarını kontrol et
innodb_log_files_in_group=2
innodb_log_buffer_size=1G
innodb_flush_method=O_DIRECT
innodb_flush_neighbors=0
innodb_io_capacity=8000
innodb_io_capacity_max=16000
innodb_read_io_threads=12
innodb_write_io_threads=12
innodb_page_cleaners=16
innodb_flush_log_at_trx_commit=2
sync_binlog=0
max_connections=1200
thread_cache_size=800
thread_handling=pool-of-threads
table_open_cache=16000
table_open_cache_instances=16
table_definition_cache=16000
open_files_limit=400000
skip_name_resolve=ON
tmp_table_size=512M
max_heap_table_size=512M
sort_buffer_size=4M
join_buffer_size=4M
max_allowed_packet=256M
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
query_cache_type=0
query_cache_size=0
Notlar:
- innodb_log_file_size büyüdükçe crash sonrası recovery süresi uzar; fakat yoğun yazma altında throughput artar.
- tmp_table_size/max_heap_table_size her bağlantı için potansiyel kullanım olduğundan, çok yükseltirsen RAM patlamasına dikkat.
- table_open_cache / open_files_limit uyumlu olmalı. Çok sayıda tablo varsa artır.
Replikasyon / Binlog (İsteğe Bağlı)
Replikasyon veya PITR (Point-in-Time Recovery) gerekiyorsa:
log_bin=binlog
binlog_format=ROW # daha doğru repl
expire_logs_days=7
sync_binlog=1 # veri güvenliği için 1; hız için 0
server_id=1 # her sunucuda benzersiz
gtid_strict_mode=1 # GTID replikasyon planlıyorsan
Yüksek yazma trafikli sistemlerde sync_binlog=1 güvenli ama maliyetlidir. İhtiyaca göre karar ver.
İşletim Sistemi İyileştirmeleri
- Swappiness düşür: vm.swappiness=1
- noatime ile mount et: gereksiz disk yazımı azalır.
- Açık dosya limiti: /etc/security/limits.conf → mysql soft/hard nofile 65535+
- NVMe scheduler: modern kernel’de genellikle none idealdir.
- NUMA: Bare-metal büyük makinelerde numactl –interleave=all veya BIOS/OS ayarı.
Uygulama ve İzleme
- Bağlantı havuzu zorunlu: DB’ye direkt binlerce bağlantı yerine pool.
- Durumu izle:
- Buffer pool isabeti: SHOW ENGINE INNODB STATUS\G veya SHOW GLOBAL STATUS
- Disk tabloya dönen geçici tablolar: Created_tmp_disk_tables
- Threads_running, Innodb_row_lock_time, Handler_read% metrikleri
- Gözlem→Ayarlama döngüsü: Değerleri kademeli değiştir, önce/stsonra ölç.
Hızlı Sağlık Kontrolleri (komutlar)
-- kritik değişkenler
SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW GLOBAL VARIABLES LIKE 'innodb_log_file_size';
SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
SHOW GLOBAL VARIABLES LIKE 'max_connections';
SHOW GLOBAL VARIABLES LIKE 'tmp_table_size';
-- durum/metrikler
SHOW GLOBAL STATUS LIKE 'Threads_running';
SHOW GLOBAL STATUS LIKE 'Created_tmp_disk_tables';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads';
SHOW GLOBAL STATUS LIKE 'Handler_read%';
Test Araçları (isteğe bağlı)
- sysbench (OLTP read/write): sentetik yük oluştur.
- mysqlslap: basit eşzamanlılık testi.
- pt-query-digest: yavaş sorguları çıkarır.
Örnek sysbench:
sysbench oltp_read_write --mysql-host=127.0.0.1 --mysql-user=test \
--mysql-password=xxx --mysql-db=bench --tables=16 --table-size=200000 \
--threads=64 --time=120 --report-interval=10 prepare
sysbench oltp_read_write ... run
sysbench oltp_read_write ... cleanup
Sorun Giderme İpuçları
- CPU %100 ama I/O düşük: indeks eksikleri, yetersiz thread_pool ayarı, kötü sorgular.
- I/O tıkanması: innodb_io_capacity artır, WAL/redo çok küçükse innodb_log_file_size büyüt.
- Disk tmp tabloları çok: Created_tmp_disk_tables yüksekse tmp_table_size/max_heap_table_size artır, sorguları gözden geçir.
- Too many connections: max_connections + uygulama pool; yetersizse kaynakları büyüt.