Innodb

Mysql 5.7 innodb_buffer_pool_size - 零 I/O?

  • December 30, 2020

我有一個關於 Mysql server 5.7 的問題,為 innodb_buffer_pool_size 設置正確的值或增加 RAM。也許我錯了,我不是專家,但讓我解釋一下它是怎麼回事。

伺服器配置: Mysql 5.7.32 伺服器執行在 Ubuntu 20.04 伺服器上,規格為 125GB 記憶體,64 核 CPU,還有 3TB 的數據庫分區。SSD是nvme,CPU是AMD EPYC 7502P,所以機器是專用的。

這是一個mysqld.cnf文件conf:

[mysqld]
#
# * Basic Settings
#
#innodb_monitor_enable      =   all
#performance_schema     =   ON
default-storage-engine      =   innodb
tmpdir              =   /data/mysql_tmp
skip-log-bin
innodb_support_xa       =   0

#
# * innodb settings
#
innodb_read_io_threads      =   64
innodb_write_io_threads     =   64
innodb_buffer_pool_instances    =   64
innodb_buffer_pool_size     =   85G
innodb_buffer_pool_chunk_size   =   256M
innodb_io_capacity      =   2500
innodb_io_capacity_max      =   5000
innodb_log_file_size        =   13G
innodb_log_buffer_size      =   32M
innodb_flush_log_at_trx_commit  =   0

query_cache_size        =   0
query_cache_type        =   0
sort_buffer_size        =   10M
join_buffer_size        =   1M
read_buffer_size        =   1M
key_buffer_size         =   16M
thread_cache_size       =   100 
read_rnd_buffer_size        =   1M

max_allowed_packet      =   1073741824
net_buffer_length       =   1048576
#innodb_fill_factor     =   50 
max_connections         =   150
table_open_cache        =   3000
table_open_cache_instances  =   55
back_log            =   65535
wait_timeout            =   31536000
connect_timeout         =   31536000
interactive_timeout     =   31536000
net_read_timeout        =   10000
net_write_timeout       =   10000

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            =   0.0.0.0

# Procedures tunning
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
event_scheduler         =   on

接下來我要分享的是,在這台伺服器上,我們有 18 個不同的數據庫,其中很多都很小。主要問題是2個大數據庫。第一個數據庫有大約 700GB 和大約 100 個表。其次有 200GB 的數據和大約 15 個表。這兩個不斷擴大(每天)。

現在讓我解釋一下我需要什麼。我的工作得到了一些票,可以對伺服器進行有關和調整innodb_buffer_pool_size的調整,並且我需要計算我們需要向該伺服器添加多少 RAM,以便 Mysql 可以將數據放入innodb_buffer_pool_size。因為還有另一種服務需要以某種奇怪的特定方式提取數據,我們想以某種方式提高它們的速度。但我不確定我該怎麼做,是否有可能。

問題是: 我們能否以某種方式將這兩個數據庫中的特定大表放在 innodb_buffer_pool_size 中,比如告訴 Mysql Server 將它們保存在 RAM 中?直到我們有一些零 I/O ?或者Mysql可以做一些事情或其他一些服務可以做到這一點?

我工作的一些負責人告訴我這是可能的,比如減去不需要的表,或者排除表?結合這個“零 I/O”的東西!?真的不知道要Google什麼,我到底能在那裡做什麼。我知道 memcached,也安裝了其他 SQL 伺服器,但現在不是一個選項。

我嘗試使用名為 mysqltuner.pl 的 PERL 腳本調整伺服器,還嘗試使用此頁面中的一些類似查詢:mysql innodb_buffer_pool_size 應該有多大?,我得到了安裝 2TB 的 ram 和類似的資訊。這對我來說太瘋狂了。

希望有人可以幫助並建議/指導一些解決方案,或者我可能在使用 innodb_buffer_pool_size 變數時看錯了。謝謝!

您的 ulimit -a 報告表明 Open Files 被作業系統限制為 1024。

從您的作業系統命令提示符中, ulimit -n 32000 將動態增加此限制。關閉然後重新啟動您的實例將使其他文件句柄可用並減少opened_tables、opened_table_definitions、opened_files。

要使此更改在作業系統重新啟動後持續存在,請遵循此網址 - https://glassonionblog.wordpress.com/2013/01/27/increase-ulimit-and-file-descriptors-limit/

  • 但在他們的範例中使用 32000 而不是 500000。

為您的 my.cnf 考慮的建議

$$ mysqld $$部分 每秒速率 - RPS

innodb_lru_scan_depth=100  # from 1024 to conserve 90% of CPU cycles used every second for the function
innodb_buffer_pool_dump_pct=90  # from 25 (percent) to reduce warmup bp time required
innodb_io_capacity=2000  # from 2500 to extend life of your NVME device
read_buffer_size=192K  # from 1M to reduce handler_read_rnd_next RPS of 160,774

移除 innodb_io_capacity_max 以允許 MySQL 自動計算最大值為 innodb_io_capacity*2

存在更多改進配置的機會。查看配置文件、聯繫人的網路配置文件和可免費下載的實用程序腳本以幫助進行性能調整,特別是我們的 findfragtables.sql 將很有幫助。

監控 SHOW GLOBAL STATUS LIKE ‘innodb_data_reads’; 當您需要更多 RAM 來支持您的 innodb_buffer_pool 時,除以每秒讀取速率的正常執行時間應該是您的主要考慮因素。提供的 SHOW GLOBAL STATUS 數據表明 RPS 為 16。許多人可以接受高達 100 RPS。當資金可用時,較少的 RPS 是可取的。0 RPS 可能是不必要的,因為 innodb 只會從 RAM 中老化最近最少使用的數據。

引用自:https://dba.stackexchange.com/questions/282219