1、概述
tcmalloc非常出名了,由google推出的記憶體管理子產品,比傳統子產品控制更合理,能應付更高的并發,而且也更穩定。現在可以将MySQL使用了tcmalloc來管理記憶體,應對高并發的場景。
但是兩者結合後,它們的記憶體使用情況,我嘗試用壓測的方式記錄記憶體使用情況,再與預設的glibc記憶體配置設定器做對比,看看其記憶體配置設定性能配置設定差異。
注意:由于是通過壓測的方式得出結果,下面的測試結果,僅供參考;畢竟在實際場景中,需要長時間的運作,才能有效展現tcmalloc記憶體管理的性能。
2、準備
測試環境為2台虛拟主機VM,配置如下:
MySQL配置參數:
shell> vim /etc/my.cnf
# innodb緩沖池大小設定為記憶體的80%
innodb_buffer_pool_size = 6442450944
# 檔案描述符
open_files_limit = 655350
innodb_open_files=655350
# 最大連接配接數
max_connections=10240
修改系統檔案描述符
shell> vim /etc/sysctl.conf
fs.file-max = 655350
# 激活
shell> sysctl -p
shell> ulimit -n 655350
shell> vim /etc/security/limits.conf
* - nofile 655350
root hard nofile 655350
root soft nofile 655350
3、安裝tcmalloc
開始安裝
選擇其中一台VM安裝tcmalloc
先安裝相關運作庫,因為是用c++寫的,需要make,還有一個運作環境libunwind
shell> yum -y install gcc make gcc-c++ libunwind
然後下載下傳并安裝google-perftools
#下載下傳源碼包
shell> wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.10/gperftools-2.10.tar.gz
shell> tar zxvf gperftools-2.10.tar.gz
#開始編譯安裝
shell> cd gperftools-2.10
shell> ./configure
shell> make && make install
#搜尋找到安裝好的相關C庫檔案
shell> find / -name libtcmalloc.so
/usr/local/lib/libtcmalloc.so
/opt/gperftools-2.5/.libs/libtcmalloc.so
#建立lib庫軟連接配接,這樣就不需要用ldconfig了
shell> ln -sf /usr/local/lib/libtcmalloc.so /usr/lib/
shell> ln -sf /usr/local/lib/libtcmalloc.so /usr/lib64/
# 檢視一下
shell> ll /usr/lib/libtcmalloc.so
配置MySQL使用
使用MySQL調用這個子產品,本文采用加載的配置檔案的方法。不過,都要重新開機MySQL程式才能生效。
沒有任何應用服務加載的話,下面這條指令是沒有傳回的:
shell> lsof -n | grep tcmalloc
然後,我們加到MySQL的配置檔案my.cnf來使用
shell> vim /usr/lib/systemd/system/mysqld.service
# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql
# 寫入配置檔案
shell> echo 'LD_PRELOAD=/usr/local/lib/libtcmalloc.so' > /etc/sysconfig/mysql
# 重新開機
shell> systemctl daemon-reload
shell> systemctl restart mysqld
# 注意: 如果是正常安裝并加載libtcmalloc.so的話,是不會報錯的,重新開機将直接生效。
shell> lsof -n | grep tcmalloc
mysqld 31423 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10
mysqld 31423 31424 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10
mysqld 31423 31437 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10
mysqld 31423 31438 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10
mysqld 31423 31439 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10
mysqld 31423 31440 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10
mysqld 31423 31441 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10
mysqld 31423 31442 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10
mysqld 31423 31443 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10
mysqld 31423 31444 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10
開始壓測
壓測工具采用MySQL官方提供的mysqlslap工具指令,至于具體用法,可以從官網查閱;以下是簡單說明:
shell> mysqlslap -h127.0.0.1 -uroot -p --concurrency=<并發量> --iterations=1 --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=<總的測試查詢次數>
說明:測試100個并發線程,測試次數1次,自動生成SQL測試腳本,讀、寫、更新混合測試,自增長字段,測試引擎為innodb,共運作1000次查詢
shell> mysqlslap -h127.0.0.1 -uroot -p --concurrency=100 --iterations=1 --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=1000
我們圍繞并發量與查詢次數兩個次元,分别用tmalloc與glibc來壓測,看看記憶體的使用情況。
并發量:100
并發量1000
并發量10000
總結
1、從并發量100,1000兩個名額來看,tmalloc占用的記憶體較少,減少記憶體碎片化會較為明顯。
2、但是在并發量10000的名額來看, 兩者的差異就不大了,反而在查詢1萬次,glibc占用記憶體更少(當時測試都覺得詫異,單獨壓測3次的)。
3、在并發量10000,并且查詢1百萬次情況下,tmalloc多次壓測都是OOM的,反而glibc會相對穩定,壓測時長平均在10分鐘左右。
4、單純從以上資料觀察, 建議使用tmalloc前,根據現有的配置,做多次測試,找出最佳的并發量平衡點,可以發揮穩定的性能。
以上就是今天的内容,希望讀者朋友看完這篇文章後有所啟發。