MySQL Binlog預分配的實現和效能

2021-06-05 04:27:04 字數 2268 閱讀 3322

最近對上提到的binlog預分配進行了實現,基於percoan5.5.18版本

在worklog中號稱在sync_binlog = 1的情況下有10倍的tps提公升。在沒有group commit的情況下確實有可能。

實現思路:

與worklog中提到的不同,這裡使用daemon plugin來實現預分配

1.建立乙個daemon plugin,這個plugin專門用於預分配binlog檔案,命名為x1~xn

在系統啟動時和建立完畢預分配檔案後,等待訊號量;

2.在new_file_impl函式(需要切換binlog時)中增加判斷,當開啟預分配時:

---存在預分配的檔案,rename之

---不存在,則通知daemon plugin去建立,自己直接返回,退化到正常的模式

3.增加乙個變數actual_size,用於記錄當前活躍binlog的寫入position,在每次signal_update之前,會對其進行更新

4.修改read_log_event,避免讀到預分配檔案中的髒資料

簡單的效能測試:

測試的結果表明在存在group commit的情況下,效能沒有worklog中提到的那麼高。

測試1:使用mysqlslap

純插入自增主鍵表

create table ***(a int auto_increment, b int ,c varchar(100), primary key(a));

插入100w資料

mysqlslap --no-defaults -uroot --create-schema=zwx --number-of-queries=1000000 --concurrency=100 --socket=/u01/mysql/run/mysql.sock --query="insert into *** values  (null,2, 'sadasda')"

1.50個執行緒

(1).binlog_prealloc_num = 0

tps = 1000000/149 = 6711

(2).binlog_prealloc_num = 10

tps = 1000000/82 = 12195

提公升(12195-6711)/6711 = 81.7%

2.100個執行緒

(1).binlog_prealloc_num = 0

tps = 1000000/86.6 = 11547

(2).binlog_prealloc_num = 10

tps = 1000000/57 = 17543

提公升(17543-11547)/11547=51.9%

測試2:使用sysbench測試update效能

./sysbench --debug=off --test=tests/db/update_index.lua --mysql-user=root --oltp-tables-count=5  --oltp-point-selects=0 --oltp-table-size=1000000 --num-threads=50 --max-requests=1000000 --max-time=7200 --oltp-auto-inc=off --mysql-engine-trx=yes --mysql-table-engine=innodb  --oltp-test-mode=notrx  --oltp-nontrx-mode=update_key   --mysql-socket=/u01/mysql/run/mysql.sock run 

1.50個執行緒

(1).binlog_prealloc_num = 0

tps = 4520.04

(2).binlog_prealloc_num = 10

tps = 6720.15

提公升(6720-4520)/4520 = 48.6%

2.100個執行緒

(1).binlog_prealloc_num = 0

tps = 5967.17

(2).binlog_prealloc_num = 10

tps = 7698.61

提公升(7698-5967)/5967 = 29%

提公升有限,初步測試效能介於sync_binlog = 1 和 sync_binlog = 0之間,不過聊勝於無.後續等穩定後放出patch

預分配執行緒 prethreading

相關網路程式設計函式 預分配執行緒 prethreading 是讓伺服器在啟動階段建立乙個執行緒池,每個客戶請求由當前可用執行緒池中的某個閒置執行緒處理 1.初始版本 每個客戶乙個執行緒 int main int argc,char argv void doit void arg 2.每個執行緒各自...

快速預分配磁碟空間

在開發過程中有時候需要為某個檔案快速地分配固定大小的磁碟空間,為什麼要這樣做呢?1 可以讓檔案盡可能的占用連續的磁碟扇區,減少後續寫入和讀取檔案時的磁碟尋道開銷 2 迅速占用磁碟空間,防止使用過程中所需空間不足。為某個檔案預分配磁碟空間必須是實際的占用磁碟空間,以linux來說,使用lseek或tr...

pmfs 實體地址預分配

老闆讓測試pmfs在有預分配和無預分配功能這兩個情況下的效能。pmfs中預分配的函式在file.c檔案中.fallocate 工具 fio 師兄寫的測試檔案 test1 fio常用引數參考 檔案 root pmfs master pmfs 注意 由於pmfs是系統檔案系統,我們先將他編譯成模組,在載...