• 13-02-2022, 22:11:39
    #1
    Merhaba, my.cnf optimizasyonu yapmak istiyorum ancak bazı verilerin ne anlama geldiğini bilmediğim için yardıma ihtiyacım var. tuning-prime.sh ile sonucları aldım. detayları aşağıda paylaşıyor olacagım. optimizasyon önerisini uyguladığım arkadaşa 50 TL hemen göndereceğim
    Server Bilgileri:
    Architecture: x86_64
    CPU op-mode(s): 32-bit, 64-bit
    Byte Order: Little Endian
    CPU(s): 8
    On-line CPU(s) list: 0-7
    Thread(s) per core: 2
    Core(s) per socket: 4
    Socket(s): 1
    NUMA node(s): 1
    Vendor ID: GenuineIntel
    CPU family: 6
    Model: 60
    Model name: Intel(R) Xeon(R) CPU E3-1230 v3 @ 3.30GHz
    Stepping: 3
    CPU MHz: 3300.000
    CPU max MHz: 3300,0000
    CPU min MHz: 1064,0000
    BogoMIPS: 6584.98
    Virtualization: VT-x
    L1d cache: 32K
    L1i cache: 32K
    L2 cache: 256K
    L3 cache: 8192K
    Current CPU usage : 0.512665%.
    Current RAM usage : 3257/15840MB (20.56%).
    Current Disk usage : 121/215GB (57%).
    System uptime : 684 days, 6 hours, 41 minutes.
    Current CPU usage : 0.512665%.
    
    UPTIME
    Current Load average: 0,02, 0,07, 0,06
    Current CPU usage : 0.512665%.
    Current RAM usage : 4489/15840MB (28.34%).
    Current Disk usage : 121/215GB (57%).
    System uptime : 684 days, 7 hours, 21 minutes.
    TUNING-PRIME SONUCU
        -- MYSQL PERFORMANCE TUNING PRIMER --
             - By: Matthew Montgomery -
    
    MySQL Version 10.4.18-MariaDB x86_64
    
    Uptime = 329 days 8 hrs 47 min 48 sec
    Avg. qps = 8
    Total Questions = 231605719
    Threads Connected = 2
    
    Server has been running for over 48hrs.
    It should be safe to follow these recommendations
    
    To find out more information on how each of these
    runtime variables effects performance visit:
    http://dev.mysql.com/doc/refman/10.4/en/server-system-variables.html
    Visit http://www.mysql.com/products/enterprise/advisors.html
    for info about MySQL's Enterprise Monitoring and Advisory Service
    
    SLOW QUERIES
    The slow query log is NOT enabled.
    Current long_query_time = 6.000000 sec.
    You have 14 out of 231605733 that take longer than 6.000000 sec. to complete
    Your long_query_time seems to be fine
    
    BINARY UPDATE LOG
    The binary update log is NOT enabled.
    You will not be able to do point in time recovery
    See http://dev.mysql.com/doc/refman/10.4/en/point-in-time-recovery.html
    
    WORKER THREADS
    Current thread_cache_size = 50
    Current threads_cached = 11
    Current threads_per_sec = 0
    Historic threads_per_sec = 0
    Your thread_cache_size is fine
    
    MAX CONNECTIONS
    Current max_connections = 750
    Current threads_connected = 2
    Historic max_used_connections = 36
    The number of used connections is 4% of the configured maximum.
    You are using less than 10% of your configured max_connections.
    Lowering max_connections could help to avoid an over-allocation of memory
    See "MEMORY USAGE" section to make sure you are not over-allocating
    
    No InnoDB Support Enabled!
    
    MEMORY USAGE
    Max Memory Ever Allocated : 12.45 G
    Configured Max Per-thread Buffers : 6.22 G
    Configured Max Global Buffers : 12.15 G
    Configured Max Memory Limit : 18.38 G
    Physical Memory : 15.46 G
    
    Max memory limit exceeds 90% of physical memory
    
    KEY BUFFER
    Current MyISAM index space = 607 K
    Current key_buffer_size = 2 M
    Key cache miss rate is 1 : 760267
    Key buffer free ratio = 68 %
    Your key_buffer_size seems to be too high.
    Perhaps you can use these resources elsewhere
    
    QUERY CACHE
    Query cache is enabled
    Current query_cache_size = 32 M
    Current query_cache_used = 12 M
    Current query_cache_limit = 512 K
    Current Query cache Memory fill ratio = 40.34 %
    Current query_cache_min_res_unit = 4 K
    Query Cache is 22 % fragmented
    Run "FLUSH QUERY CACHE" periodically to defragment the query cache memory
    If you have many small queries lower 'query_cache_min_res_unit' to reduce fragmentation.
    MySQL won't cache query results that are larger than query_cache_limit in size
    
    SORT OPERATIONS
    Current sort_buffer_size = 2 M
    Current read_rnd_buffer_size = 2 M
    Sort buffer seems to be fine
    
    JOINS
    ./tuning-primer.sh: line 402: export: `2097152': geçerli bir belirteç değil
    Current join_buffer_size = 2.00 M
    You have had 260295 queries where a join could not use an index properly
    You have had 244 joins without keys that check for key usage after each row
    You should enable "log-queries-not-using-indexes"
    Then look for non indexed joins in the slow query log.
    If you are unable to optimize your queries you may want to increase your
    join_buffer_size to accommodate larger joins in one pass.
    
    Note! This script will still suggest raising the join_buffer_size when
    ANY joins not using indexes are found.
    
    OPEN FILES LIMIT
    Current open_files_limit = 16384 files
    The open_files_limit should typically be set to at least 2x-3x
    that of table_cache if you have heavy MyISAM usage.
    Your open_files_limit value seems to be fine
    
    TABLE CACHE
    Current table_open_cache = 2000 tables
    Current table_definition_cache = 400 tables
    You have a total of 368 tables
    You have 659 open tables.
    The table_cache value seems to be fine
    
    TEMP TABLES
    Current max_heap_table_size = 1.00 G
    Current tmp_table_size = 1.00 G
    Of 10212578 temp tables, 18% were created on disk
    Created disk tmp tables ratio seems fine
    
    TABLE SCANS
    Current read_buffer_size = 2 M
    Current table scan ratio = 38513 : 1
    You have a high ratio of sequential access requests to SELECTs
    You may benefit from raising read_buffer_size and/or improving your use of indexes.
    
    TABLE LOCKING
    Current Lock Wait ratio = 1 : 497
    You may benefit from selective use of InnoDB.
    If you have long running SELECT's against MyISAM tables and perform
    frequent updates consider setting 'low_priority_updates=1'
  • 14-02-2022, 11:43:42
    #2
    Merhaba,

    Veritabanındaki tabloların yapısı nedir? MyISAM ve InnoDB farkı var biliyorsunuz. Bunlardan hangisini kullanıyorsunuz?
  • 14-02-2022, 14:39:19
    #3
    EfendiBey adlı üyeden alıntı: mesajı görüntüle
    Merhaba,

    Veritabanındaki tabloların yapısı nedir? MyISAM ve InnoDB farkı var biliyorsunuz. Bunlardan hangisini kullanıyorsunuz?
    InnoDB agırlıklı kullanıyorum. bazı kucuk tablolarda myisam var.
  • 14-02-2022, 15:52:10
    #4
    Şimdi şöyle bir durum var. InnoDB ağırlıklı kullanıyorsanız -ki evet kullanıyorsunuz, o zaman sunucunuzun RAM miktarının %75-80'nini ona ayırmanız gerekiyor. Yaptığınız testlerde ise InnoDB tanımlaması olmadığını belirtiyor. Yani aldığınız sonuç MyISAM yapısına göre sunulmuş dolayısıyla bu sonuçların doğruluğu kesin değil çünkü InnoDB ağırlığı fazla görünüyor.

    Öncelikle, internette gördüğünüz her my.cnf konfigürasyonuna aldanmayın çünkü her site aynı olmadığı gibi, her insanın kullanım şekli de aynı değildir. Örneğin aynı sunucudan 2 tane düşünün. Birisinde farklı yazılım vardır, diğerinde farklıdır ve ikisinin my.cnf konfigürasyonu aynı olmaz. Mesela birinde MySQL yükü yok denecek kadar azdır ve onun my.cnf çok farklıdır. Şimdi siz onu alıp kullanırsanız sunucunuza alakasız bir optimizasyon yapmış olursunuz.

    Çok hassas bir detay daha var ki, my.cnf optimizasyonunu mutlak bir biçimde yapmak ve en iyi verimi almak için mevcut veritabanını önce yedeğini alıp sonra silip, ardından my.cnf konfigüre edip, son olarak da MySQL'i başlatıp hemen ardından veritabanını temizce yüklemek gerekiyor. Bunu, bir yazılımın temiz kurulumunu yapmak gibi düşünün. Bilhassa InnoDB kayıtlarının verimli ve güvenli bir şekilde listelenmesi için çok önemli olduğunu söyleyebilirim.

    Size şunu sorayım. Hangi paneli, -httpd dahil- scriptleri kullanıyorsunuz? cPanel, Apache, Litespeed, DirectAdmin, Nginx vb. gibi bunlardan hangisi? Bir de sunucu özellikleri tam olarak nedir? Son olarak my.cnf dosyasını buraya kopyalar mısınız? Bu my.cnf optimizasyon kolay bir iş değil. Soracak çok soru olabiliyor. Sitenizin günlük hiti, anlık veri girişleri, kullandığınız önbelleklemeler vs tümünü toplayıp hesaplayıp ona göre sonuç belirlemek gerekiyor. Sizin aldığınız sonuçlar genelde düz mantıkla çalışır. Az önce de belirttiğim gibi, mesela InnoDB tanımlaması yok ve ne tanımlıysa ona göre bir sonuç vermiş ki, halbuki açıkça InnoDB kullanıyorsunuz gibi vs vs konu böyle uzuyor.

    Buna ilave olarak, gözlemlediğim kadarıyla sürekli bir veri girişi var. InnoDB tabloların büyüklüğünden bunu anlıyorum çünkü InnoDB insert+update (veri girişi ve güncelleme), MyISAM ise select (okuma) için idealdir. Örneğin hiç veri girişi olmayan ve sadece okunan bir siteniz varsa MyISAM harikadır ama sürekli veri girişi olan bir siteniz varsa InnoDB harikadır. Tabii harikadır ama InnoDB kaynak tüketimi fazladır. RAM miktarının büyük çoğunu ona ayırmanız gerekir ve bunu yapmazsanız hem verim alamazsınız, hem de en ufak bir zorlanmada sunucu yavaşlayabilir, CPU aşırı yükselebilir. Tabii site hızını da olumsuz yönde etkiler maalesef.
  • 14-02-2022, 23:26:36
    #5
    EfendiBey adlı üyeden alıntı: mesajı görüntüle
    Şimdi şöyle bir durum var. InnoDB ağırlıklı kullanıyorsanız -ki evet kullanıyorsunuz, o zaman sunucunuzun RAM miktarının %75-80'nini ona ayırmanız gerekiyor. Yaptığınız testlerde ise InnoDB tanımlaması olmadığını belirtiyor. Yani aldığınız sonuç MyISAM yapısına göre sunulmuş dolayısıyla bu sonuçların doğruluğu kesin değil çünkü InnoDB ağırlığı fazla görünüyor.

    Öncelikle, internette gördüğünüz her my.cnf konfigürasyonuna aldanmayın çünkü her site aynı olmadığı gibi, her insanın kullanım şekli de aynı değildir. Örneğin aynı sunucudan 2 tane düşünün. Birisinde farklı yazılım vardır, diğerinde farklıdır ve ikisinin my.cnf konfigürasyonu aynı olmaz. Mesela birinde MySQL yükü yok denecek kadar azdır ve onun my.cnf çok farklıdır. Şimdi siz onu alıp kullanırsanız sunucunuza alakasız bir optimizasyon yapmış olursunuz.

    Çok hassas bir detay daha var ki, my.cnf optimizasyonunu mutlak bir biçimde yapmak ve en iyi verimi almak için mevcut veritabanını önce yedeğini alıp sonra silip, ardından my.cnf konfigüre edip, son olarak da MySQL'i başlatıp hemen ardından veritabanını temizce yüklemek gerekiyor. Bunu, bir yazılımın temiz kurulumunu yapmak gibi düşünün. Bilhassa InnoDB kayıtlarının verimli ve güvenli bir şekilde listelenmesi için çok önemli olduğunu söyleyebilirim.

    Size şunu sorayım. Hangi paneli, -httpd dahil- scriptleri kullanıyorsunuz? cPanel, Apache, Litespeed, DirectAdmin, Nginx vb. gibi bunlardan hangisi? Bir de sunucu özellikleri tam olarak nedir? Son olarak my.cnf dosyasını buraya kopyalar mısınız? Bu my.cnf optimizasyon kolay bir iş değil. Soracak çok soru olabiliyor. Sitenizin günlük hiti, anlık veri girişleri, kullandığınız önbelleklemeler vs tümünü toplayıp hesaplayıp ona göre sonuç belirlemek gerekiyor. Sizin aldığınız sonuçlar genelde düz mantıkla çalışır. Az önce de belirttiğim gibi, mesela InnoDB tanımlaması yok ve ne tanımlıysa ona göre bir sonuç vermiş ki, halbuki açıkça InnoDB kullanıyorsunuz gibi vs vs konu böyle uzuyor.

    Buna ilave olarak, gözlemlediğim kadarıyla sürekli bir veri girişi var. InnoDB tabloların büyüklüğünden bunu anlıyorum çünkü InnoDB insert+update (veri girişi ve güncelleme), MyISAM ise select (okuma) için idealdir. Örneğin hiç veri girişi olmayan ve sadece okunan bir siteniz varsa MyISAM harikadır ama sürekli veri girişi olan bir siteniz varsa InnoDB harikadır. Tabii harikadır ama InnoDB kaynak tüketimi fazladır. RAM miktarının büyük çoğunu ona ayırmanız gerekir ve bunu yapmazsanız hem verim alamazsınız, hem de en ufak bir zorlanmada sunucu yavaşlayabilir, CPU aşırı yükselebilir. Tabii site hızını da olumsuz yönde etkiler maalesef.
    uzun uzun cevapladıgın için çok teşekkür ediyorum.
    Bu bir site değil. mobil uygulama api 'si yani trafik aplication üzerinden geliyor. DB'ye yazma ağırlıklı işler yapılıyor.
    innoDB neden kapalı bunu bilmiyorum nasıl acılır onun için yönlendirmelere,önerilere açığım.
    panel olarak openlitespeed, php7.4, mariadb 10.4
    sunucu belirttiğim gibi 16gb ram
    my.cnf dosyamı aynen oldugu gibi paylaşıyorum.

    #
    
    # include all files from the config directory
    
    #
    
    !includedir /etc/my.cnf.d
    
    
    [mysqld]
    #log-error                      = /var/lib/mysql/server.err
    datadir                         =/var/lib/mysql
    socket                          =/var/lib/mysql/mysql.sock
    tmpdir                          =/var/tmpfs
    user                            =mysql
    symbolic-links                  =0
    port                            =3306
    #bind-address                   =0.0.0.0
    log-error                       =/var/log/mariadb/mariadb.log
    
    performance-schema              = 0
    default-storage-engine          = InnoDB
    innodb_file_per_table           = 1
    max_allowed_packet              = 256M
    open_files_limit                = 10240
    
    max_binlog_size                 = 256M
    expire_logs_days                = 1
    
    thread_stack                    = 512K
    sort_buffer_size                = 2M
    read_buffer_size                = 2M
    read_rnd_buffer_size            = 2M
    join_buffer_size                = 2M
    binlog_cache_size               = 64K
    back_log                        = 1024
    query_cache_size                = 32M
    query_cache_limit               = 512K
    
    max_connections                 = 250
    max_connect_errors              = 10000
    concurrent_insert               = 2
    connect_timeout                 = 100
    
    max_heap_table_size             = 1G
    bulk_insert_buffer_size         = 1G
    tmp_table_size                  = 2K
    
    #thread_concurrency             = 0
    thread_cache_size               = 50
    
    
    key_buffer                      = 2M
    myisam_sort_buffer_size         = 128M
    myisam_max_sort_file_size    = 256M
    
    innodb_write_io_threads         = 16
    innodb_read_io_threads          = 16
    
    innodb_file_per_table
    #innodb_data_file_path          = ibdata1:128M;ibdata2:10M:autoextend
    innodb_buffer_pool_size         = 12G
    #innodb_additional_mem_pool_size        = 4M
    innodb_flush_log_at_trx_commit  = 2
    innodb_log_file_size            = 2G
    innodb_buffer_pool_instances    = 12
    innodb_log_buffer_size          = 128M
    innodb_lock_wait_timeout        = 128 #300du
    innodb_thread_concurrency    = 8
    innodb_commit_concurrency    = 2
    innodb_flush_method             = O_DIRECT
    #innodb_support_xa              = 0
    #skip-innodb-doublewrite
    #sync_binlog                    = 0
    
    wait-timeout                    = 90
    interactive-timeout             = 90
    
    long_query_time                 = 6
    log_output                      = FILE
    slow_query_log                  = OPEN
    slow_query_log_file             = /etc/mysql-slow-req.log
  • 15-02-2022, 09:08:41
    #6
    man_blood adlı üyeden alıntı: mesajı görüntüle
    uzun uzun cevapladıgın için çok teşekkür ediyorum. Bu bir site değil. mobil uygulama api 'si yani trafik aplication üzerinden geliyor. DB'ye yazma ağırlıklı işler yapılıyor. innoDB neden kapalı bunu bilmiyorum nasıl acılır onun için yönlendirmelere,önerilere açığım. panel olarak openlitespeed, php7.4, mariadb 10.4 sunucu belirttiğim gibi 16gb ram my.cnf dosyamı aynen oldugu gibi paylaşıyorum.

    1- ÖNCE YEDEK ALIN

    2- MySQL sunucuyu durdurun

    3- Şimdi my.cnf dosyasını, aşağıdakilerle değiştirin:

    #
    # include all files from the config directory
    #
    !includedir /etc/my.cnf.d
    
    [mysqld]
    datadir                         =/var/lib/mysql
    socket                          =/var/lib/mysql/mysql.sock
    tmpdir                          =/var/tmpfs
    user                            =mysql
    symbolic-links                  =0
    port                            =3306
    log-error                       =/var/log/mariadb/mariadb.log
    table_open_cache = 3072
    table_definition_cache = 4096
    max_heap_table_size = 64M
    tmp_table_size = 64M
    max_connections = 505
    max_user_connections = 500
    max_allowed_packet = 16M
    thread_cache_size = 32
    query_cache_size = 64M
    
    innodb_file_per_table = 1
    innodb_buffer_pool_size = 13G
    innodb_buffer_pool_instances = 4
    innodb_flush_log_at_trx_commit = 1
    innodb_log_file_size = 512M
    innodb_log_files_in_group = 2
    
    myisam_recover = backup,force
    
    long_query_time                 = 6
    log_output                      = FILE
    slow_query_log                  = OPEN
    slow_query_log_file             = /etc/mysql-slow-req.log
    log-bin=mysql-bin
    binlog_cache_size = 1M
    binlog_format=mixed
    server-id = 1
    
    [mysqldump]
    quick
    max_allowed_packet = 16M
    
    [mysql]
    no-auto-rehash
    
    [myisamchk]
    key_buffer_size = 256M
    sort_buffer_size = 256M
    read_buffer = 4M
    write_buffer = 4M
    
    [mysqlhotcopy]
    interactive-timeout
    Kaydedin ve MySQL sunucuyu yeniden başlatın.

    Çalışırsa sorun yok demektir. Tabii eğer yeniden başlamazsa veya hata verirse panik yapmayın. Eskisine geri alın ve bilakis şununla değiştirin:

    #
    # include all files from the config directory
    #
    !includedir /etc/my.cnf.d
    
    [mysqld]
    datadir                         =/var/lib/mysql
    socket                          =/var/lib/mysql/mysql.sock
    tmpdir                          =/var/tmpfs
    user                            =mysql
    symbolic-links                  =0
    port                            =3306
    log-error                       =/var/log/mariadb/mariadb.log
    
    performance-schema              = 0
    default-storage-engine          = InnoDB
    max_allowed_packet              = 256M
    open_files_limit                = 10240
    
    max_binlog_size                 = 256M
    expire_logs_days                = 1
    
    thread_stack                    = 512K
    sort_buffer_size                = 2M
    read_buffer_size                = 2M
    read_rnd_buffer_size            = 2M
    join_buffer_size                = 2M
    binlog_cache_size               = 64K
    back_log                        = 1024
    query_cache_size                = 32M
    query_cache_limit               = 512K
    
    max_connections                 = 250
    max_connect_errors              = 10000
    concurrent_insert               = 2
    connect_timeout                 = 100
    
    max_heap_table_size             = 1G
    bulk_insert_buffer_size         = 1G
    tmp_table_size                  = 2K
    thread_cache_size               = 50
    
    key_buffer                      = 2M
    myisam_sort_buffer_size         = 128M
    myisam_max_sort_file_size    = 256M
    
    innodb_file_per_table = 1
    innodb_buffer_pool_size         = 13G
    innodb_flush_log_at_trx_commit  = 1
    innodb_log_file_size            = 512M
    innodb_buffer_pool_instances    = 4
    innodb_log_buffer_size          = 64M
    innodb_lock_wait_timeout        = 128
    innodb_thread_concurrency    = 8
    innodb_commit_concurrency    = 2
    innodb_flush_method             = O_DIRECT
    
    wait-timeout                    = 90
    interactive-timeout             = 90
    
    long_query_time                 = 6
    log_output                      = FILE
    slow_query_log                  = OPEN
    slow_query_log_file             = /etc/mysql-slow-req.log
    Yine aynı şekilde hata verirse yine eskisine geri alın ve benimle iletişime geçebilirsiniz. Hata vermezse ve sorunsuz çalışırsa, hangisiyle olduğunu tekrar paylaşırsınız çünkü bir kere daha düzenleme gerekecek. Gerçi MySQL yeniden başlattıktan sonra biraz inceleme yaparsınız sorun olmaz fakat yine de belirtirsiniz artık...