天天看點

關于MySQL配置tcmalloc後在高并發下記憶體使用情況

作者:mj談雲技術

1、概述

tcmalloc非常出名了,由google推出的記憶體管理子產品,比傳統子產品控制更合理,能應付更高的并發,而且也更穩定。現在可以将MySQL使用了tcmalloc來管理記憶體,應對高并發的場景。

但是兩者結合後,它們的記憶體使用情況,我嘗試用壓測的方式記錄記憶體使用情況,再與預設的glibc記憶體配置設定器做對比,看看其記憶體配置設定性能配置設定差異。

注意:由于是通過壓測的方式得出結果,下面的測試結果,僅供參考;畢竟在實際場景中,需要長時間的運作,才能有效展現tcmalloc記憶體管理的性能。

2、準備

測試環境為2台虛拟主機VM,配置如下:

關于MySQL配置tcmalloc後在高并發下記憶體使用情況

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

關于MySQL配置tcmalloc後在高并發下記憶體使用情況
關于MySQL配置tcmalloc後在高并發下記憶體使用情況

并發量1000

關于MySQL配置tcmalloc後在高并發下記憶體使用情況
關于MySQL配置tcmalloc後在高并發下記憶體使用情況

并發量10000

關于MySQL配置tcmalloc後在高并發下記憶體使用情況
關于MySQL配置tcmalloc後在高并發下記憶體使用情況

總結

1、從并發量100,1000兩個名額來看,tmalloc占用的記憶體較少,減少記憶體碎片化會較為明顯。

2、但是在并發量10000的名額來看, 兩者的差異就不大了,反而在查詢1萬次,glibc占用記憶體更少(當時測試都覺得詫異,單獨壓測3次的)。

3、在并發量10000,并且查詢1百萬次情況下,tmalloc多次壓測都是OOM的,反而glibc會相對穩定,壓測時長平均在10分鐘左右。

4、單純從以上資料觀察, 建議使用tmalloc前,根據現有的配置,做多次測試,找出最佳的并發量平衡點,可以發揮穩定的性能。

以上就是今天的内容,希望讀者朋友看完這篇文章後有所啟發。