innoDB 內存優化

innodb 緩存機制

  1. innodb 用一塊內存區做io緩存池.該緩存池不僅用來緩存innodb的索引塊,而且緩存innodb的數據塊.
  2. innodb 緩存池邏輯有free list,flush list,lru list 組成.
    • free list 空閒的緩存塊列表
    • flush list 需要刷新到磁盤的緩存塊列表
    • lru list innodb 正在使用的緩存塊. innodb buffer pool的核心.
  3. lru 算法; 將lru list 分爲 young sublist 和old sublist, 數據衝磁盤讀入時,會將該緩存塊插入到lru list 的’中點’,即old sublist 的頭部,經過一定的時間訪問,(由 innodb_old_blocks_time 系統參數決定),該數據塊將會有old sublist 轉移到young sublist 頭部. 也就是整個lru list 的頭部. 隨時間推移,young sublist 和old sublist 中較少被訪問的緩存塊將移動到尾部. 需要淘汰數據塊時,優先淘汰尾部數據. 這種設計同樣爲了防止偶爾被訪問的索引塊將訪問頻繁的熱塊淘汰.
  4. 髒頁的刷新存在於flush 和lru list . lru 也存在可以刷新的髒頁.這裏可以直接刷新. 默認 BP(innodb_buffer_pool)中不存在可以的數據頁的時候.會掃描lru list 的尾部的innodb_lru_scan_depth 個數據頁(默認1024個數據頁).進行相關的刷新操作. 淘汰的數據頁會立刻放入到free list 中去.

通過調整buffer pool大小,改變young sublist 和old sublist的分配比例.控制髒數據的刷新活動,使用多個innodb 緩存池 等方法優化innodb 性能

innodb 數據頁大小16k.

innodb_buffer_pool_size 設置.

  1. innodb_buffer_size的值越大,緩存命中率越高.訪問innodb表需要的磁盤io就越少.性能也就越高.
    1.一般專用的數據庫服務器上,可以將80%的物理內存分配給innodb_buffer_pool.但一定要注意避免設置過大而導致頁交換
    查看 buffer_poll 使用情況
    show status like ‘innodb_buffer%’;
    Variable_name | Value |
    ±--------------------------------------±-------------------------------------------------+
    | Innodb_buffer_pool_dump_status | Dumping of buffer pool not started |
    | Innodb_buffer_pool_load_status | Buffer pool(s) load completed at 170821 17:20:03 |
    | Innodb_buffer_pool_resize_status | |
    | Innodb_buffer_pool_pages_data | 5842417 |
    | Innodb_buffer_pool_bytes_data | 95722160128 |
    | Innodb_buffer_pool_pages_dirty | 8930 |
    | Innodb_buffer_pool_bytes_dirty | 146309120 |
    | Innodb_buffer_pool_pages_flushed | 559620864 |
    | Innodb_buffer_pool_pages_free | 10241 |
    | Innodb_buffer_pool_pages_misc | 45222 |
    | Innodb_buffer_pool_pages_total | 5897880 |
    | Innodb_buffer_pool_read_ahead_rnd | 0 |
    | Innodb_buffer_pool_read_ahead | 9626 |
    | Innodb_buffer_pool_read_ahead_evicted | 0 |
    | Innodb_buffer_pool_read_requests | 27123370943 |
    | Innodb_buffer_pool_reads | 8506 |
    | Innodb_buffer_pool_wait_free | 0 |
    | Innodb_buffer_pool_write_requests | 13232653001

*緩存池命中率.=(1-innodb_buffer_pool_reads/innodb_buffer_pool_read_request)100

調整old sublist 大小 innodb_old_blocks_pct

  1. 在lru list 中,old sublist 的比例有系統innodb_old_blocks_pct 決定,取值範圍5-95,默認37.約等於(3/8).
    查看命令: show variables like ‘innodb_old_blocks_pct%’;
    例如: 在沒有較大表掃描或索引掃描的情況下,如果young/s的值很低,可能就需要適當增大innodb_old_blocks_pct的值或者減小innodb_old_blocks_time的值. 提高熱點數據緩存

調整innodb_old_blocks_time 的設置

  1. innodb_old_blocks_time 參數決定了緩存數據塊有old到young的快慢.當一個緩存數據塊被插入到midpoint 後,至少要在old sublist 停留過innodb_old_blocks_time(ms)後,纔有可能被轉移到new sublist. --進行大表掃描時需調大innodb_old_blocks_time值,避免表掃描污染buffer pool的情況.

根據innodb monitor 輸出的信息來調整innodb_old_blocks_time 的值. 在進行表掃描是,如果non-youngs/s 很低,應考慮將innodb_old_blocks_time 調大,以防止掃描將真正的熱數據淘汰.

調整緩存池數量,減少內部對緩存池數據結構的爭用 innodb_buffer_pool_instances

  1. 指定的緩存平分到 instances個buffer pool

控制innodb buffer 刷新,延長數據緩存的時間,減緩磁盤io

  1. 在innodb 找不到乾淨的可用的緩存頁或者檢查點被觸發的情況下,innodb的後臺線程就會開始把’髒的緩存頁’回寫到磁盤文件中,這個過程叫緩存的刷新.
    影響參數.
    1. innodb_max_dirty_pages_pct,控制緩存池中髒頁的最大比例.默認75%.如果髒頁到達該值,innodb 後臺線程將開始緩存刷新.
    2. innodb_io_capacity. 代表磁盤系統的io能力.一定程度上該值代表磁盤每秒可完成的i/o次數. 默認值200.對於轉速低的磁盤.如7200rpm的磁盤. 可以調節該值到100,對於固態硬盤和由多個磁盤組成的盤振,可以適當調大該值.
      innodb_io_capacity 決定一批刷新髒頁的數量,當髒頁比例到innodb_max_dirty_pages_pct時,innodb 大約將 innodb_io_capacity個已改變的緩存頁刷新到磁盤.當髒頁比例小於max_dirty_pages_pct時,如果innodb_adaptive_flushing的設置爲true. innodb 將根據函數buf_flush_get_desired_flush_rate 返回的重做日誌產生的速度來確定要刷新的髒頁數.
      可以根據monitor的值來調整innodb_max_dirty_pages_pct 和io_capaity. 例如: 若ininodb_buffer_pool_wait_free 值增長較快,則說明innodb經常在等待空閒緩存頁,如果無法增大緩存池,那應將innodb_max_dirty_pages_pct值調小,或將io_capacity值提高.以加快髒頁的刷新.

innodb doublewrite.

  1. 默認開啓innodb的雙寫功能對性能的影響不大.
  2. 如果要求超高性能,又能容忍極端情況下的少量數據丟失的應用. 可以通過配置文件中增加innodb_doublewrite=0 參數設置來關閉doublewrite.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章