MySQL全面優(yōu)化
1.優(yōu)化哲學
1.1 為什么優(yōu)化?
為了獲得成就感?
為了證實比系統(tǒng)設計者更懂數(shù)據(jù)庫?
為了從優(yōu)化成果來證實優(yōu)化者更有價值?
但通常事實證實的結果往往會和您期待相反!
優(yōu)化有風險,涉足需謹慎!
1.2 優(yōu)化風險
優(yōu)化不總是對一個單純的環(huán)境進行!還很可能是一個復雜的已投產(chǎn)的系統(tǒng)。
優(yōu)化手段本來就有很大的風險,只不過你沒能力意識到和預見到!
任何的技術可以解決一個問題,但必然存在帶來一個問題的風險!
對于優(yōu)化來說解決問題而帶來的問題控制在可接受的范圍內(nèi)才是有成果。
保持現(xiàn)狀或出現(xiàn)更差的情況都是失敗!
穩(wěn)定性和業(yè)務可持續(xù)性通常比性能更重要!
優(yōu)化不可避免涉及到變更,變更就有風險!
優(yōu)化使性能變好,維持和變差是等概率事件!
優(yōu)化不能只是數(shù)據(jù)庫管理員擔當風險,但會所有的人分享優(yōu)化成果!
所以優(yōu)化工作是由業(yè)務需要驅使的!?。?
1.3 誰參與優(yōu)化
數(shù)據(jù)庫管理員
業(yè)務部門代表
應用程序架構師
應用程序設計人員
應用程序開發(fā)人員
硬件及系統(tǒng)管理員
存儲管理員
1.4 優(yōu)化方向
安全優(yōu)化(業(yè)務持續(xù)性)
性能優(yōu)化(業(yè)務高效性)
1.5 優(yōu)化的范圍及思路
優(yōu)化范圍:
存儲、主機和操作系統(tǒng):
主機架構穩(wěn)定性
I/O規(guī)劃及配置
Swap
OS內(nèi)核參數(shù)
網(wǎng)絡問題
應用程序:(Index,lock,session)
應用程序穩(wěn)定性和性能
SQL語句性能
串行訪問資源
性能欠佳會話管理
數(shù)據(jù)庫優(yōu)化:(內(nèi)存、數(shù)據(jù)庫設計、參數(shù))
內(nèi)存
數(shù)據(jù)庫結構(物理&邏輯)
實例配置
優(yōu)化效果和成本的評估:
2. 優(yōu)化工具的使用
2.1 系統(tǒng)層面的
2.1.1 CPU
top
top -H
top -H -p pid
top -H -p 9618
CPU使用情況:
%Cpu(s):
0.1 us : 用戶進程占用CPU時間占比
我們覺得越高越好,不要滿負荷
0.2 sy : 系統(tǒng)本身和內(nèi)核工作CPU時間占比
資源管理,維護,分配,回收等等.
并發(fā)連接過高 .
鎖爭用
99.8 id : 空閑
0.0 wa : 等待時CPU時間占比
IO吞吐 有問題 : 硬件,鏈路,RAID
IO/PS 峰值 : 大量隨機IO ,索引設計不合理,多表連接優(yōu)化不到位,大量子查詢,大事務.
鎖爭用
2.1.2 MEM
KiB Mem : 4028432 total, 3774464 free, 116240 used, 137728 buff/cache
1.2.1 名稱介紹
total :總內(nèi)存大小
free :空閑的
used :在使用的
buff/cache :緩沖區(qū) 和 緩存
2.1.3 內(nèi)存管理子系統(tǒng):
slab Allocator
buddy system
程序=指令+數(shù)據(jù)
對于page cache來講(OS buffer)
1. 內(nèi)存的可用空間的計算 free +buffer cache
2. 內(nèi)存回收(buffer)的方式:
(1) 寫入磁盤
(2) swap
對于數(shù)據(jù)庫來講:需要將swap屏蔽掉
2.1.4 swap
KiB Swap: 2097148 total, 2097148 free, 0 used. 3701464 avail Mem
Linux 6操作系統(tǒng),默認回收策略(buffer cache),不立即回收策略
內(nèi)存使用達到100%-60%時候,40% 會使用swap
Linux 7操作系統(tǒng)
內(nèi)存使用達到100%-30%(70%)時候,才會時候swap
cat /proc/sys/vm/swappiness
30
echo 0 >/proc/sys/vm/swappiness 的內(nèi)容改成0(臨時)
vim /etc/sysctl.conf
添加:
vm.swappiness=0
sysctl -p
2.2. iostat 命令
dd if=/dev/zero of=/tmp/bigfile bs=1M count=4096
iostat -dm 1
現(xiàn)象說明
1. IO 高 cpu us 也高,屬于正?,F(xiàn)象
2. CPU us高 IO很低 ,MySQL 不在做增刪改查,有可能是存儲過程,函數(shù),排序,分組,多表連接
3. Wait,SYS 高 , IO低: IO出問題了,鎖等待過多的幾率比較大.
IOPS:每秒磁盤最多能夠發(fā)生的IO次數(shù),這是個定值
頻繁小事務,IOPS很高,達到閾值,可能IO吞吐量沒超過IO最大吞吐量.無法新的IO了
存儲規(guī)劃有問題.
2.3 數(shù)據(jù)庫優(yōu)化工具
show status
show variables
show index
show processlist
show slave status
show engine innodb status
desc /explain
slowlog
擴展類深度優(yōu)化:
pt系列
mysqlslap
sysbench
information_schema
performance_schema
sys
3. 優(yōu)化思路分解
3.1 硬件優(yōu)化
3.1.1 主機
(1) 真實的硬件(PC Server):
DELL R系列 ,華為,浪潮,HP,聯(lián)想 ,曙光
(2)云產(chǎn)品:
ECS、
數(shù)據(jù)庫RDS、DRDS\Polardb , TDSQL
(3) IBM 小型機:
P6 570 595
P7 720 750 780
P8
3.1.2 CPU根據(jù)數(shù)據(jù)庫類型
OLTP 在線事務處理系統(tǒng).
OLAP 數(shù)據(jù)分析,處理
IO密集型:線上系統(tǒng),OLTP主要是IO密集型的業(yè)務,高并發(fā)
CPU密集型:數(shù)據(jù)分析數(shù)據(jù)處理,OLAP,cpu密集型的,需要CPU高計算能力(i系列,IBM power系列)
CPU密集型: I 系列的,主頻很高,核心少
IO密集型: E系列(至強),主頻相對低,核心數(shù)量多
3.1.3 內(nèi)存
建議2-8倍cpu核心數(shù)量 (ECC)
3.1.4 磁盤選擇
SATA-III SAS Fc SSD(sata) pci-e ssd Flash
主機 RAID卡的BBU(Battery Backup Unit)關閉
3.1.3 存儲設備
根據(jù)存儲數(shù)據(jù)種類的不同,選擇不同的存儲設備
配置合理的RAID級別(raid5、raid10、熱備盤)
r0 :條帶化 ,性能高
r1 :鏡像,安全
r5 :校驗+條帶化,安全較高+性能較高(讀),寫性能較低 (適合于讀多寫少)
r10:安全+性能都很高,最少四塊盤,浪費一半的空間(高IO要求)
3.1.4 網(wǎng)絡
1、硬件買好的(單卡單口)
2、網(wǎng)卡綁定(bonding),交換機堆疊
以上問題,提前規(guī)避掉。
3.2 操作系統(tǒng)優(yōu)化
3.2.1 Swap調(diào)整
echo 0 >/proc/sys/vm/swappiness的內(nèi)容改成0(臨時),
vim /etc/sysctl.conf
上添加vm.swappiness=0(永久)
sysctl -p
擴展:內(nèi)存管理
1. 三個區(qū)域 :
常駐內(nèi)存集: 程序運行服務的
頁緩存page cache:
FREE list
LRU list
匿名頁:
2. Slab Allocator
將 page cache 劃分成了好多條鏈狀結構.
類型一:
Free list(空閑的)
==================================================
| |
o o
類型二 :
LRU list (正在被使用的)
冷================================================熱
i i
0 0
3. buddy system (內(nèi)存伙伴系統(tǒng))
內(nèi)存回收和重利用
cat /proc/sys/vm/swappiness ====> 0
free list 上為 0;
buddy system 進行內(nèi)存回收和重利用
1. 優(yōu)先釋放 Cache(負責查詢類的內(nèi)存結構),從冷到熱進行釋放.
2. Cache沒法釋放時,會根據(jù)buffer從冷導熱,進行回收和重用內(nèi)存
3. 所有可被釋放 buffer 或cache,已經(jīng)全部被回收重用了,還是內(nèi)存緊缺的話
此時,swap還是會被使用.
內(nèi)存泄露問題:
8G 使用率達到了 95%以上
innodb_buffer_pool_size=2G
redo_buffer_size=256M
其他內(nèi)存總共: 1G 左右
innodb_flush_log_at_trx_commit=1
innodb_flush_method=O_DIRECT
3.2.2 IO調(diào)度策略
centos 7 默認是 deadline
cat /sys/block/sda/queue/scheduler
cat /sys/block/vda/queue/scheduler
# 臨時修改為deadline(centos6)
echo deadline >/sys/block/sda/queue/scheduler
vi /boot/grub/grub.conf
更改到如下內(nèi)容:
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet
IO :
raid
no lvm
ext4或xfs
ssd
IO調(diào)度策略
提前規(guī)劃好以上所有問題,減輕MySQL優(yōu)化的難度。
3.3 應用層
1. 開發(fā)過程規(guī)范,標準
2. 減少慢SQL:不走索引,復雜邏輯,切割大事務.
like '%aa%'
!= not in
limit >500w
DDL ---> show processlist ; ---> kill ---> Online DDL ,pt-osc
delete 大量數(shù)據(jù). ----> pt-archive
update : 索引 , 鎖.
3. 避免業(yè)務邏輯錯誤,避免鎖爭用.
a : update id=10 ; update id=100;
b : update id=100; update id=10;
這個階段,需要我們DBA深入業(yè)務,或者要和開發(fā)人員\業(yè)務人員配合實現(xiàn)
優(yōu)化,最根本的是"優(yōu)化"人.
----oldguo