MySQL高性能學(xué)習(xí)筆記
一、Ubuntu 安裝mysql
我們?cè)赨buntu環(huán)境下裝一個(gè)測(cè)試用的MySQL來(lái)學(xué)習(xí)。
1.更新包
- sudo apt-get update
2.安裝MySQL的服務(wù)端和客戶端
- sudo apt-get install mysql-server mysql-client
在安裝的過程中,需要輸入數(shù)據(jù)庫(kù)密碼。
3.啟動(dòng)Mysql
- sudo service mysql restart
4.登錄mysql
- mysql -u root -p
二、sysbench基準(zhǔn)測(cè)試
sysbench是一個(gè)開源的、模塊化的、跨平臺(tái)的多線程性能測(cè)試工具,可以用來(lái)進(jìn)行CPU、內(nèi)存、磁盤I/O、線程、數(shù)據(jù)庫(kù)的性能測(cè)試。目前支持的數(shù)據(jù)庫(kù)有MySQL、Oracle和PostgreSQL。當(dāng)前功能允許測(cè)試的系統(tǒng)參數(shù)有:
file I/O performance (文件I / O性能)
scheduler performance (調(diào)度性能)
memory allocation and transfer speed (內(nèi)存分配和傳輸速度)
POSIX threads implementation performance (POSIX線程執(zhí)行績(jī)效)
database server performance (OLTP benchmark) (數(shù)據(jù)庫(kù)服務(wù)器性能)
1.安裝
Ubuntu系統(tǒng)可以直接apt,如:
- apt-get install sysbench
在安裝的時(shí)候出現(xiàn)了這樣的錯(cuò)誤:Could not get lock /var/lib/dpkg/lock
出現(xiàn)這個(gè)問題可能是有另外一個(gè)程序正在運(yùn)行,導(dǎo)致資源被鎖不可用。而導(dǎo)致資源被鎖的原因可能是上次運(yùn)行安裝或更新時(shí)沒有正常完成,進(jìn)而出現(xiàn)此狀況,解決的辦法其實(shí)很簡(jiǎn)單:
在終端中敲入以下兩句
- sudo rm /var/cache/apt/archives/lock
- sudo rm /var/lib/dpkg/lock
再試著安裝,問題解決。
2.通用選項(xiàng)說(shuō)明
- root@db2:~# sysbench
- Missing required command argument.
Usage: #使用方法
- sysbench [general-options]... --test=<test-name> [test-options]... command
General options: #通用選項(xiàng)
--num-threads=N number of threads to use [1] #創(chuàng)建測(cè)試線程的數(shù)目。默認(rèn)為1.
--max-requests=N limit for total number of requests [10000] #請(qǐng)求的最大數(shù)目。默認(rèn)為10000,0代表不限制。
--max-time=N limit for total execution time in seconds [0] #最大執(zhí)行時(shí)間,單位是s。默認(rèn)是0,不限制。
--forced-shutdown=STRING amount of time to wait after --max-time before forcing shutdown [off] #超過max-time強(qiáng)制中斷。默認(rèn)是off。
--thread-stack-size=SIZE size of stack per thread [32K] #每個(gè)線程的堆棧大小。默認(rèn)是32K。
--init-rng=[on|off] initialize random number generator [off] #在測(cè)試開始時(shí)是否初始化隨機(jī)數(shù)發(fā)生器。默認(rèn)是off。
--test=STRING test to run #指定測(cè)試項(xiàng)目名稱。
--debug=[on|off] print more debugging info [off] #是否顯示更多的調(diào)試信息。默認(rèn)是off。
--validate=[on|off] perform validation checks where possible [off] #在可能情況下執(zhí)行驗(yàn)證檢查。默認(rèn)是off。
--help=[on|off] print help and exit #幫助信息。
--version=[on|off] print version and exit #版本信息。
Compiled-in tests: #測(cè)試項(xiàng)目
fileio - File I/O test #IO
cpu - CPU performance test #CPU
memory - Memory functions speed test #內(nèi)存
threads - Threads subsystem performance test #線程
mutex - Mutex performance test #互斥性能測(cè)試
oltp - OLTP test # 數(shù)據(jù)庫(kù),事務(wù)處理
Commands: prepare:測(cè)試前準(zhǔn)備工作; run:正式測(cè)試 cleanup:測(cè)試后刪掉測(cè)試數(shù)據(jù) help version
See 'sysbench --test=<name> help' for a list of options for each test. #查看每個(gè)測(cè)試項(xiàng)目的更多選項(xiàng)列表
更多選項(xiàng):
1):sysbench --test=fileio help
- root@db2:~# sysbench --test=fileio help
- sysbench 0.4.12: multi-threaded system evaluation benchmark
fileio options:
--file-num=N 創(chuàng)建測(cè)試文件的數(shù)量。默認(rèn)是128
--file-block-size=N 測(cè)試時(shí)文件塊的大小。默認(rèn)是16384(16K)
--file-total-size=SIZE 測(cè)試文件的總大小。默認(rèn)是2G
--file-test-mode=STRING 文件測(cè)試模式{seqwr(順序?qū)?, seqrewr(順序讀寫), seqrd(順序讀), rndrd(隨機(jī)讀), rndwr(隨機(jī)寫), rndrw(隨機(jī)讀寫)}
--file-io-mode=STRING 文件操作模式{sync(同步),async(異步),fastmmap(快速map映射),slowmmap(慢map映射)}。默認(rèn)是sync
--file-extra-flags=STRING 使用額外的標(biāo)志來(lái)打開文件{sync,dsync,direct} 。默認(rèn)為空
--file-fsync-freq=N 執(zhí)行fsync()的頻率。(0 – 不使用fsync())。默認(rèn)是100
--file-fsync-all=[on|off] 每執(zhí)行完一次寫操作就執(zhí)行一次fsync。默認(rèn)是off
--file-fsync-end=[on|off] 在測(cè)試結(jié)束時(shí)才執(zhí)行fsync。默認(rèn)是on
--file-fsync-mode=STRING 使用哪種方法進(jìn)行同步{fsync, fdatasync}。默認(rèn)是fsync
--file-merged-requests=N 如果可以,合并最多的IO請(qǐng)求數(shù)(0 – 表示不合并)。默認(rèn)是0
--file-rw-ratio=N 測(cè)試時(shí)的讀寫比例。默認(rèn)是1.5
2):sysbench --test=cpu help
--cpu-max-prime=N 最大質(zhì)數(shù)發(fā)生器數(shù)量。默認(rèn)是10000
3):sysbench --test=memory help
- root@db2:~# sysbench --test=memory help
- sysbench 0.4.12: multi-threaded system evaluation benchmark
memory options:
--memory-block-size=SIZE 測(cè)試時(shí)內(nèi)存塊大小。默認(rèn)是1K
--memory-total-size=SIZE 傳輸數(shù)據(jù)的總大小。默認(rèn)是100G
--memory-scope=STRING 內(nèi)存訪問范圍{global,local}。默認(rèn)是global
--memory-hugetlb=[on|off] 從HugeTLB池內(nèi)存分配。默認(rèn)是off
--memory-oper=STRING 內(nèi)存操作類型。{read, write, none} 默認(rèn)是write
--memory-access-mode=STRING存儲(chǔ)器存取方式{seq,rnd} 默認(rèn)是seq
4):sysbench --test=threads help
sysbench 0.4.12: multi-threaded system evaluation benchmark
threads options:
--thread-yields=N 每個(gè)請(qǐng)求產(chǎn)生多少個(gè)線程。默認(rèn)是1000
--thread-locks=N 每個(gè)線程的鎖的數(shù)量。默認(rèn)是8
5):sysbench --test=mutex help
- root@db2:~# sysbench --test=mutex help
- sysbench 0.4.12: multi-threaded system evaluation benchmark
mutex options:
--mutex-num=N 數(shù)組互斥的總大小。默認(rèn)是4096
--mutex-locks=N 每個(gè)線程互斥鎖的數(shù)量。默認(rèn)是50000
--mutex-loops=N 內(nèi)部互斥鎖的空循環(huán)數(shù)量。默認(rèn)是10000
6): sysbench --test=oltp help
- root@db2:~# sysbench --test=oltp help
- sysbench 0.4.12: multi-threaded system evaluation benchmark
oltp options:
--oltp-test-mode=STRING 執(zhí)行模式{simple,complex(advanced transactional),nontrx(non-transactional),sp}。默認(rèn)是complex
--oltp-reconnect-mode=STRING 重新連接模式{session(不使用重新連接。每個(gè)線程斷開只在測(cè)試結(jié)束),transaction(在每次事務(wù)結(jié)束后重新連接),query(在每個(gè)SQL語(yǔ)句執(zhí)行完重新連接),random(對(duì)于每個(gè)事務(wù)隨機(jī)選擇以上重新連接模式)}。默認(rèn)是session
--oltp-sp-name=STRING 存儲(chǔ)過程的名稱。默認(rèn)為空
--oltp-read-only=[on|off] 只讀模式。Update,delete,insert語(yǔ)句不可執(zhí)行。默認(rèn)是off
--oltp-skip-trx=[on|off] 省略begin/commit語(yǔ)句。默認(rèn)是off
--oltp-range-size=N 查詢范圍。默認(rèn)是100
--oltp-point-selects=N number of point selects [10]
--oltp-simple-ranges=N number of simple ranges [1]
--oltp-sum-ranges=N number of sum ranges [1]
--oltp-order-ranges=N number of ordered ranges [1]
--oltp-distinct-ranges=N number of distinct ranges [1]
--oltp-index-updates=N number of index update [1]
--oltp-non-index-updates=N number of non-index updates [1]
--oltp-nontrx-mode=STRING 查詢類型對(duì)于非事務(wù)執(zhí)行模式{select, update_key, update_nokey, insert, delete} [select]
--oltp-auto-inc=[on|off] AUTO_INCREMENT是否開啟。默認(rèn)是on
--oltp-connect-delay=N 在多少微秒后連接數(shù)據(jù)庫(kù)。默認(rèn)是10000
--oltp-user-delay-min=N 每個(gè)請(qǐng)求最短等待時(shí)間。單位是ms。默認(rèn)是0
--oltp-user-delay-max=N 每個(gè)請(qǐng)求最長(zhǎng)等待時(shí)間。單位是ms。默認(rèn)是0
--oltp-table-name=STRING 測(cè)試時(shí)使用到的表名。默認(rèn)是sbtest
--oltp-table-size=N 測(cè)試表的記錄數(shù)。默認(rèn)是10000
--oltp-dist-type=STRING 分布的隨機(jī)數(shù){uniform(均勻分布),Gaussian(高斯分布),special(空間分布)}。默認(rèn)是special
--oltp-dist-iter=N 產(chǎn)生數(shù)的迭代次數(shù)。默認(rèn)是12
--oltp-dist-pct=N 值的百分比被視為'special' (for special distribution)。默認(rèn)是1
--oltp-dist-res=N ‘special’的百分比值。默認(rèn)是75
General database options:
--db-driver=STRING 指定數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序('help' to get list of available drivers)
--db-ps-mode=STRING編制報(bào)表使用模式{auto, disable} [auto]
Compiled-in database drivers:
- mysql - MySQL driver
mysql options:
--mysql-host=[LIST,...] MySQL server host [localhost]
--mysql-port=N MySQL server port [3306]
--mysql-socket=STRING MySQL socket
--mysql-user=STRING MySQL user [sbtest]
--mysql-password=STRING MySQL password []
--mysql-db=STRING MySQL database name [sbtest]
--mysql-table-engine=STRING storage engine to use for the test table {myisam,innodb,bdb,heap,ndbcluster,federated} [innodb]
--mysql-engine-trx=STRING whether storage engine used is transactional or not {yes,no,auto} [auto]
--mysql-ssl=[on|off] use SSL connections, if available in the client library [off]
--myisam-max-rows=N max-rows parameter for MyISAM tables [1000000]
--mysql-create-options=STRING additional options passed to CREATE TABLE []
3.測(cè)試線程
- sysbench --test=threads --num-threads=500 --thread-yields=100 --thread-locks=4 run
4.測(cè)試IO
--num-threads 開啟的線程 --file-total-size 總的文件大小
1,prepare階段,生成需要的測(cè)試文件,完成后會(huì)在當(dāng)前目錄下生成很多小文件。
- sysbench --test=fileio --num-threads=16 --file-total-size=2G --file-test-mode=rndrw prepare
2,run階段
- sysbench --test=fileio --num-threads=20 --file-total-size=2G --file-test-mode=rndrw run
下面的命令運(yùn)行文件 I/O 混合隨機(jī)讀/寫基準(zhǔn)測(cè)試:
- sysbench --test=fileio --file-total-size=3G --file-test-mode=rndrw --max-time=300 --max-requests=0 run
執(zhí)行結(jié)果:
輸出結(jié)果分析:
每秒請(qǐng)求數(shù)是:233.33 Requests/sec
吞吐量是:3.6458Mb/sec
清除運(yùn)行文件:
- sysbench --test=fileio --file-total-size=3G cleanup
5.清理測(cè)試時(shí)生成的文件
- sysbench --test=fileio --num-threads=20 --file-total-size=2G --file-test-mode=rndrw cleanup
6.測(cè)試內(nèi)存
- sysbench --test=memory --memory-block-size=8k --memory-total-size=1G run
7.測(cè)試mutex
- sysbench –test=mutex –num-threads=100 –mutex-num=1000 –mutex-locks=100000 –mutex-loops=10000 run
8.測(cè)試OLTP
1,prepare階段,生成需要的測(cè)試表
- sysbench --test=oltp --mysql-table-engine=innodb --mysql-host=192.168.X.X --mysql-db=test --oltp-table-size=500000 --mysql-user=root --mysql-password=123456 prepare
2,run階段
- sysbench --num-threads=16 --test=oltp --mysql-table-engine=innodb --mysql-host=192.168.x.x --mysql-db=test --oltp-table-size=500000 --mysql-user=root --mysql-password=123456 run
3,清理測(cè)試時(shí)生成的測(cè)試表
- sysbench --num-threads=16 --test=oltp --mysql-table-engine=innodb --mysql-host=192.168.x.x --mysql-db=test --oltp-table-size=500000 --mysql-user=root --mysql-password=123456 cleanup
三、服務(wù)器性能剖析
我們實(shí)際開發(fā)中,最常碰到三個(gè)性能相關(guān)的服務(wù)器請(qǐng)求:
1、如何確認(rèn)服務(wù)器是否達(dá)到了性能最佳的狀態(tài);
2、找出某條語(yǔ)句為什么執(zhí)行不夠快
3、診斷被用戶描述成“停頓”、“堆積”或“卡死”的某些間歇性疑難故障
找到慢的原因,我們才能夠?qū)ΠY下藥。
1、何為性能?
我們將性能定義為完成某件任務(wù)所需要的時(shí)間度量,換句話說(shuō),性能即響應(yīng)時(shí)間。
完成一項(xiàng)任務(wù)所需要的時(shí)間可以分成兩部分:執(zhí)行時(shí)間和等待時(shí)間。
2、測(cè)量PHP應(yīng)用程序
這里我們用一個(gè)PHP性能剖析工具,名叫ifP(instrumentation-for-php),代碼托管在Google Code上(https://code.google.com/archi...),該工具可以更好的關(guān)注數(shù)據(jù)庫(kù)的調(diào)用。所以當(dāng)無(wú)法在數(shù)據(jù)庫(kù)層面進(jìn)行測(cè)試的時(shí)候,Ifp可以很好的幫助應(yīng)用剖析數(shù)據(jù)庫(kù)的利用率。Ifp是一個(gè)提供了計(jì)數(shù)器和計(jì)時(shí)器的單例類,很容易部署到生產(chǎn)環(huán)境中,因?yàn)椴恍枰L問PHP的配置權(quán)限(因?yàn)閷?duì)于很多開發(fā)人員來(lái)說(shuō),都沒有訪問PHP的配置的權(quán)限。)
- error_reporting(-1);
- require_once('../src/Instrumentation.php');
- $instance = false;
- $ret = Instrumentation::get_instance()->start_request();
- print_r($ret);