4.MySQL效能優化
引數優化--innodb_buffer_pool_size
單例項效能
例項需求
例項標準化
注:原始碼中在innodb儲存引擎層搜尋srv_buf_pool_size(在srv0srv.c、srv0start.c檔案中)。
引數優化--innodb_buffer_pool_instances
將innodb_buffer_pool劃分為不同的instance
每個instance獨立的LRU、FLUSH、FREE
獨立的mutex控制
注:在innodb儲存引擎層搜尋srv_buf_pool_instances(主要集中在的buf0buf.c檔案)
引數優化--innodb_log_file_size
先寫入innodb_log_buffer
buffer寫滿或事務提交,重新整理資料
大事務頻繁,增加innodb_log_buffer_size大小
注:在innodb儲存引擎層搜尋srv_log_buffer_size(主要在log0log.c檔案中)
引數優化--innodb_thread_concurrency
innodb_thread_concurrency = 0,innodb內部自己控制
kernel_mutex競爭
CPU上下文切換
innodb_thread_concurrency設定為cpu的核心數
注:在innodb儲存引擎層搜尋srv_thread_concurrency(主要在srv0srv.c檔案中)
引數優化--innodb_io_capacity
innodb每秒後臺程式處理IO操作的資料頁上限
innodb_buffer_pool_size總的io處理能力上限
innodb_buffer_pool_instances分割成多個記憶體塊時,每個記憶體塊的IO處理能力為:innodb_io_capacity/innodb_buffer_pool_instances
注:在innodb儲存引擎層搜尋srv_io_capacity(主要在srv0srv.c檔案中)
引數優化--innodb_max_dirty_pages_pct
innodb從innodb buffer中重新整理髒頁的比例
重新整理髒頁,產生checkpoint
髒頁重新整理innodb_max_dirty_pages_pct * innodb_io_capacity
注: 在innodb儲存引擎層搜尋srv_max_buf_pool_modified_pct(主要在srv0srv.c檔案中)
引數優化--innodb_flush_method
O_DSYNC:使用O_SYNC開啟和重新整理log檔案,使用fsync()重新整理資料檔案。
O_DIRECT:使用O_DIRECT開啟資料檔案,使用fsync()重新整理日誌檔案和資料檔案。
在raid裝置上,為了避免資料被innodb_buffer和raid多次cache,設定為O_DIRECT方式。
注:在innodb儲存引擎層搜尋srv_unix_file_flush_method(主要在log0log.c、os0file.c檔案中)
引數優化--innodb_file_per_table
不同的表空間可以靈活設定資料目錄的地址
避免共享表空間產生的IO競爭
引數優化--innodb_flush_log_at_trx_commit
0:每秒將log buffer的內容寫事務日誌並且重新整理到磁碟;
1:每個事務提交後,將log_buffer的內容寫事務日誌並資料磁碟;
2:每個事務提交,將log_buffer內容寫事務日誌,但不進行資料刷盤
原始碼:
if (trx->flush_log_later) {
/* Do nothing yet */
trx->must_flush_log_later = TRUE;
} else if (flush_log_at_trx_commit == 0) {
/* Do nothing */
} else if (flush_log_at_trx_commit == 1) {
if (srv_unix_file_flush_method == SRV_UNIX_NOSYNC) {
/* Write the log but do not flush it to disk */
log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, FALSE);
} else {
/* Write the log to the log files AND flush them to disk */
log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, TRUE);
}
} else if (flush_log_at_trx_commit == 2) {
/* Write the log but do not flush it to disk */
log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, FALSE);
} else {
ut_error;
}
引數優化--sync_binlog
重新整理binlog的數目
雙1模式,即:innodb_flush_log_at_trx_commit = 1,sync_binlog = 1,這樣主備的資料是一致的,不會丟失資料。
系統優化--NUMA
在os層numa關閉時,開啟bios層的numa會影響效能,QPS會下降15-30%;
在bios層面numa關閉是,無論os層面的numa是否開啟,都不會影響效能。
系統優化--malloc
1、下載jemalloc原始碼包
wget http://www.canonware.com/download/jemalloc/jemalloc-3.6.0.tar.bz2
tar -xjf jemalloc-3.6.0.tar.bz2
2、編譯安裝
cd jemalloc-3.6.0; ./configure;make &make install
3、配置MySQL
[mysqld_safe]
malloc-lib=$PATH/libjemalloc.so
系統優化--網路卡
RSS: Receive Side Scaling。網路卡多佇列,需要硬體支援。網路卡接收到網路資料包之後,要傳送一個硬體中斷,通知CPU取資料包。預設配置,都是由CPU0去做。
RPS: Receive Packet Steering。向某CPU傳送一個軟中斷,來接收資料包,並遞交給應用程式。
RFS: Receive Flow Steering。維護兩張hash表,實現將軟中斷分散到多顆CPU去處理。
結論:
減少CPU之間的cache互動; hash計算精準定位到目標CPU。
CPU空閒時,RT效能優化; CPU忙碌時,RT反而惡化。
RFS的hash表條數對效能有較大影響。
系統優化--記憶體插法
6根記憶體在4通道里的插法為:2/2/1/1,簡稱42插法
6根記憶體在4通道里的插法為:2/2/2/0,簡稱33插法
HP/DELL/華為/英業達對比:
- HP/DELL/華為保持42插法效能會比33插法效能高。NUMA開啟,QPS提升8-20%;NUMA關閉,QPS值能提升12-38%。
- 英業達無論何種插法都表現良好
參考資料
1、《innodb parameters》
http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html
2、《Choosing innodb_buffer_pool_size》
http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/
3、《The InnoDB Buffer Pool》
http://dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html
4、《Configuring the Rate of InnoDB Buffer Pool Flushing》
http://dev.mysql.com/doc/refman/5.5/en/innodb-performance-adaptive_flushing.html
5、《Optimizing InnoDB Disk I/O》
http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-diskio.html
6、《jemalloc》
http://www.canonware.com/jemalloc/
7、《scalable memory allocation using jemalloc》
http://www.facebook.com/notes/facebook-engineering/scalable-memory-allocation-using-jemalloc/480222803919
8、《MySQL performance: Impact of memory allocators》
http://www.mysqlperformanceblog.com/2012/07/05/impact-of-memory-allocators-on-mysql-performance/
9、《MySQL performance: Impact of memory allocators (Part 2)》
http://www.mysqlperformanceblog.com/2013/03/08/mysql-performance-impact-of-memory-allocators-part-2/
10、《MySQL效能測試--jemalloc記憶體管理》
http://blog.chinaunix.net/uid-26896862-id-3865087.html
11、《A High-Performance Nehalem iDataPlex Cluster and DDN S2A9990 Storage for Texas A&M University》
http://sc.tamu.edu/systems/eos/
12、《Non-uniform memory access》
http://en.wikipedia.org/wiki/Non-Uniform_Memory_Access
13、《MySQL單機多例項方案》
http://www.hellodb.net/tag/numa
14、《Introduction to NUMA on xSeries Servers》
http://www.redbooks.ibm.com/abstracts/tips0476.html?Open
15、《Numa對MySQL多例項效能測試報告 》
http://blog.chinaunix.net/uid-26896862-id-3278913.html
16、《MySQL Blob Compression performance benefits》
http://www.mysqlperformanceblog.com/2008/01/11/mysql-blob-compression-performance-benefits/
17、《Scaling in the Linux Networking Stack》
https://www.kernel.org/doc/Documentation/networking/scaling.txt
相關文章
- 【前端效能優化】vue效能優化前端優化Vue
- 效能優化優化
- 效能優化案例-SQL優化優化SQL
- 【效能優化】ORACLE資料庫效能優化概述優化Oracle資料庫
- 前端效能優化(JS/CSS優化,SEO優化)前端優化JSCSS
- Android效能優化----卡頓優化Android優化
- 前端效能優化 --- 圖片優化前端優化
- [效能優化]DateFormatter深度優化探索優化ORM
- MySQL 效能優化之索引優化MySql優化索引
- Web效能優化:圖片優化Web優化
- MySQL 效能優化之SQL優化MySql優化
- Android效能優化篇之計算效能優化Android優化
- mysql效能優化MySql優化
- Redis 效能優化Redis優化
- 效能優化有感優化
- react效能優化React優化
- javascript效能優化JavaScript優化
- Javascript 效能優化JavaScript優化
- php效能優化PHP優化
- 前端效能優化前端優化
- JVM效能優化JVM優化
- java效能優化Java優化
- TableView效能優化View優化
- mongodb效能優化MongoDB優化
- Canvas效能優化Canvas優化
- web效能優化Web優化
- MySQL——效能優化MySql優化
- oracle 效能優化Oracle優化
- React 效能優化React優化
- Spark效能優化Spark優化
- 效能優化篇優化
- Openfire 效能優化優化
- UI效能優化UI優化
- javasciprt效能優化Java優化
- EF效能優化優化
- sql效能優化SQL優化
- Hive效能優化Hive優化
- iOS效能優化iOS優化