[TOC]
http://tools.percona.com/wizard
這個網站根據信息填寫會給出相應的配置建議
# centos系統參數優化
## 內核相關參數優化 ( /etc/sysctl.conf )
通常服務器與數據庫之間通過tcp3次握手來建立網絡連接,同時有個端口會在監聽,監聽的端口會有多個監聽隊列
~~~
net.core.somaxconn=65535 #每個端口最大監聽的長度
net.core.netdev_max_backlog=65535 #在每個網絡接收速率比內核接收快的時候,允許發送到隊列數據包的最大速率
net.ipv4.tcp_max_syn_backlog=65535 #允許未獲得對方請求可保存在隊列中的最大的連接數目
net.ipv4.tcp_fin_timeout=10 #用來控制tcp連接的等待時間,對于經常訪問,通常會有大量連接處于等待狀態的,而這個參數就是加快tcp等待時間,加快回收速度
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1 #主要加快tcp回收速度
#tcp接收和發送數據的緩沖區默認值和最大值
net.core.wmem_default=87380
net.core.wmem_max=16777216
net.core.rmem_default=87380
net.core.rmem_max=16777216
#tcp失效連接占用系統資源,加快資源回收
net.ipv4.tcp_keepalive_time=120 #表示tcp發送keepalive探測消息的時間間隔,單位為秒
net.ipv4.tcp_keepalive_intvl=30 #控制發送keepalive探測消息沒有消息時候,重發的間隔,單位為秒
net.ipv4.tcp_keepalive_probes=3 #失效之前重發的次數
#這個參數應該設置的足夠大,以便能在一個共享內存段下容納下整個Innodb緩沖池大小
#這個參數設置過低,會造成需要在系統中創建出多個共享內存段
#這個值的大小對于64位系統linux,可取的最大值為物理內存值-1byte,建議值為物理內存的一半,一般取值大于Innodb緩沖池的大小即可,可以取物理內存值-1byte
kernel.shmmax=4294967295
#這個參數當內存不足時會對性能產生比較明顯的影響
#內存不足的時候會用到linux交換分區swap,將虛擬內存寫到磁盤的交換區,來發生內存交換
#當這對mysql性能會是嚴重下降(free -m 命名看交換分區),建議mysql配置參數不使用交換分區
#這個參數告訴系統除非內存滿了,否則不要用交換分區
vm.swappiness=0
~~~
## 增加資源限制 (/etc/security/limit.conf)
這個文件其實就是linux PAM也就是插入式認證模塊的配置文件
打開文件數的限制
打開最大文件數的配置
~~~
#把這2個參數加到limit.conf文件的末尾就行了
* soft nofile 65535
* hard nofile 65535
*表示對所有用戶生效
soft 表示當前系統生效的設置,soft限制不能比hard高
hard 聲明系統中所能設定的最大值
nofile 表示所限制的資源是打開文件的最大數目
65535 就是限制的數量
# 注意需要重啟操作系統才可生效
~~~
## 磁盤調度策略 (/sys/block/devname/queue/scheduler)
~~~
cat /sys/block/sda/queue/scheduler
noop anticipatory deadline[cfq]
~~~
linux系統下對磁盤塊設備的調度,實際上是塊設備發送到底層設備的順序,默認情況用的是cfq
上面命令顯示用的是cfq,cfq一般系統用是可以的,但是對mysql的話性能不是很好
noop(電梯式調度策略)
NOOP實現了一個FIFO隊列,它像電梯的工作方法一樣對I/O請求進行組織,當有一個新的請求到來時,它將請求合并到最近的請求之后,以此來保證請求同一介質.NOOP傾向餓死讀而利于寫,因此NOOP對于閃存設備,RAM,嵌入式系統是最好的選擇
deadline(截止時間調度)
Deadline保證了在一個截止時間內服務的請求,這個截止時間是可調整的,而默認讀期限短于寫期限.這樣就防止了寫操作因為不能被讀取而餓死的現象,Deadline對數據庫類應用是最好的選擇
anticipatory(預料I/O調度策略)
本質上與Deadline一樣,但在最后一次讀操作后,要等待6ms,才能繼續進行對其他I/O請求進行調度.它會在每個6ms中插入新的I/O操作,而會將一些小寫入流合并成一個大寫入流,用寫入延遲換取最大的寫入吞吐量.AS適合寫入較多的環境,比如文件服務器,AS對數據庫環境表現很差
我們可以通過這個命令把磁盤調度策略改為deadline
~~~
echo <schedulername > /sys/block/devname/queue/scheduler
如 echo deadline > /sys/block/devname/queue/scheduler
~~~
## 文件系統對性能的影響
windows有FAT和NTFS,實際可選擇就只有NTFS
linux有EXT3,EXT4,XFS,這3個都是有日志功能,這3個表現好的是XFS
如果是EXT3/4系統的掛載參數(/etc/fstab)
~~~
data=writeback | ordered | journal # 3個參數表示不同的日志策略
# writeback表示源數據寫入和數據寫入不是同步的,這是最快的日志
# ordered保證一致,在寫源數據的時候先寫數據
# journal 更安全,最慢的
還有2個參數,noatime, nodiratime
表示禁止訪問時間和讀取時間,禁用2個選項,有利于寫的速度
例子:
/dev/sda1/ext4 noatime,nodiratime,data=writeback11
~~~
# Mysql服務器參數
## 內存配置參數
* 確定可以使用的內存的上限
* 確定Mysql每個連接使用的內存
~~~
sort_buffer_size
排序緩沖區內存,規定了每個線程使用排序緩沖區大小,不是在連接初始化的時候就分配的,而是在有查詢要做排序操作的時候才會分配內存,需要注意的是當查詢做排序操作的時候就會立即分配該排序這么多內存,不管他是否需要這么大的內存,如果我們給他設置100M,當10個連接進來做排序的時候,mysql就會占用1G內存
join_buffer_size
關聯緩沖區大小,每個線程使用關聯緩沖區大小.當一個連接關聯多張表的時候,為每個關聯分配一個緩沖,所以一個關聯會有多個緩沖
read_buffer_size
每個線程當對myisam表全表掃描時,讀使用的緩沖區大小,有查詢需要的時候才會分配,這個參數的大小一定要是4K的倍數
read_rnd_buffer_size
排序操作時將表的row pointer讀入sort buffer,然后讀取sort buffer中的row pointer并排序,按排序后的row pointer將行讀入read_rnd_buffer中
每個線程當需要的時候,mysql會分配,不是全部給設置的大小
Innodb_buffer_pool_size
innodb所使用的緩沖池的大小,不僅緩存索引還會緩存數據,插入緩沖,鎖等等,innodb還能利用緩存池來幫助寫入,然后一起順序的寫入磁盤
總內存-(每個線程所需要的內存*連接數)-系統保留內存 這樣就是這個大小了
需要注意的是,如果給他分配很大的內存,當關閉的時候,innodb也需要很長的時候把內存中的一些東西寫到磁盤上
key_buffer_size 這個是給myisam用的,用來緩存索引,myisam表只能緩存索引,數據是由操作系統緩存的,mysql的系統表還在使用myisam存儲引擎
~~~
## I/O相關的配置參數
這部分決定了,修改的數據如何同步到磁盤上,對數據做持久化保存,這部分參數對性能影響也是比較大的
## innodb I/O相關配置
他是事務存儲引擎,他為了節省I/O開銷,他是每次事務都寫入事務日志中而不是每次修改都寫到磁盤中,為了提高I/O性能,因為每次事務都要把數據寫到對應表的隨機位置,這樣會產生大量的隨機I/O,而記錄事務日志是順序I/O相比刷新臟數據要快的多,寫到事務日志就算成功
即使服務器宕機,我們也能從事務日志中恢復以及提交的事務
~~~
Innodb_log_file_size 控制單個事務日志的大小
Innodb_log_files_in_group 控制事務日志文件的個數
事務日志總大小 = Innodb_log_files_in_group*Innodb_log_file_size
事務日志是循環使用的,當這個使用滿了才會使用下一個
一般來說事務日志的總大小可以記錄服務器一個小時的事務總信息
事務不是先寫入到事務日志文件中的,而是先寫入事務日志的緩沖區,然后在刷新到磁盤中
Innodb_log_buffer_size 用來控制日志緩沖區大小,至少一秒就會刷新到磁盤,32M-128M不要設置太大,而刷新頻率影響還是比較大的
Innodb_flush_log_at_trx_commit
值有0和1,2
0:每秒進行一次log寫入cache,并flush log到磁盤,當mysql崩潰至少丟失1秒的數據
1 [默認]:在每次事務提交執行log寫入到cache,并flush log到磁盤
2[建議]:每次事務提交,執行log數據寫入到cache,每秒執行一次flush log到磁盤,mysql進程崩潰不會丟失數據,但是服務器宕機才可能丟失至少一秒數據
Innodb_flush_method=O_DIRECT
innodb刷新方式,innodb的數據文件和日志文件如何和系統進行交互,影響innodb怎么寫數據和怎么讀數據,設置為這個值就是建議操作系統不要緩存數據也不要預讀,完全關閉操作系統緩存
Innodb_file_per_table=1
Innodb_doublewrite=1 控制innodb是否啟用雙寫緩存,避免沒有寫完整造成數據丟失,增加數據安全性,對性能有一些影響,影響不會太大
~~~
## MyISAM I/O相關配置
~~~
delay_key_write 控制關鍵字緩沖的臟塊什么時候刷新到磁盤中
OFF:每次寫操作后刷新鍵緩沖中的臟塊到磁盤中,關閉延遲寫入,最安全的選項,性能比較差
ON:只對鍵表時指定了delay_key_write選項的表使用延遲刷新
ALL:對所有MYISAM表都使用延遲鍵寫入
注意:如果當mysql崩潰,臟塊中數據沒有寫入就會造成myisam索引的損壞,這樣就要對myisam表進行修復了
~~~
## 安全相關配置參數
~~~
expire_logs_days指定自動清理binlog的天數
開啟了binlog就要開啟這個,清理舊的binlog日志,避免日志太大,設置至少2次全備的間隔
max_allowed_packet控制mysql可以接收的包的大小,也控制用戶定義變量最大的大小,配置了主從的話要保持一致,從小于主否則會導致主從失敗
skip_name_resolve 禁用DNS查找,但是禁用的話只能對ip或者ip段或者host文件中出現的進行授權了
sysdate_is_now確保了sysdate()返回確定性日期
read_only 禁止非super權限的用戶寫權限,建議在主從復制中的從庫使用,這樣就只接受主庫中的寫入
skip_slave_start 禁止slave自動恢復,在主從上從庫使用的,從庫崩潰會自動恢復,但是這個恢復一般是危險的,一般要我們檢查通過才允許恢復
sql_mode 設置mysql所使用的SQL模式
~~~
## 其他常用的配置參數
~~~
sync_binlog 控制mysql如何向磁盤刷新binlog
默認為0,mysql不會寫,操作系統會根據情況來寫
1,就是每次事務提交都會寫到binlog,最安全的,建議主庫上使用
tmp_table_size和max_heap_table_size
一起設置的,控制內存臨時表大小,不要設置太大
max_connections控制允許的最大連接數,默認是100
~~~
- SQL
- 名詞
- mysql
- 初識mysql
- 備份和恢復
- 存儲引擎
- 數據表損壞和修復
- mysql工具
- 數據庫操作
- 增
- 刪
- 改
- 查
- 數據類型
- 整數類型
- 小數類型
- 日期時間類型
- 字符和文本型
- enum類型
- set類型
- 時間類型
- null與not null和null與空值''的區別
- 數據表操作
- 創建
- 索引
- 約束
- 表選項列表
- 表的其他語句
- 視圖
- sql增刪改查
- sql增
- sql刪
- sql改
- sql查
- sql語句練習
- 連接查詢和更新
- 常用sql語句集錦
- 函數
- 字符函數
- 數值運算符
- 比較運算符與函數
- 日期時間函數
- 信息函數
- 聚合函數
- 加密函數
- null函數
- 用戶權限管理
- 用戶管理
- 權限管理
- pdo
- 與pdo相關的幾個類
- 連接數據庫
- 使用
- pdo的錯誤處理
- pdo結果集對象
- pdo結果集對象常用方法
- pdo預處理
- 常用屬性
- mysql編程
- 事務
- 語句塊
- mysql中的變量
- 存儲函數
- 存儲過程
- 觸發器
- mysql優化
- 存儲引擎
- 字段類型
- 三范式和逆范式
- 索引
- 查詢緩存
- limit分頁優化
- 分區
- 介紹
- 分區算法
- list分區
- range范圍
- Hash哈希
- key鍵值
- 分區管理
- 特別注意
- 分表
- 數據碎片與維護
- innodb表壓縮
- 慢查詢
- explain執行計劃
- count和max,groupby優化
- 子查詢優化
- mysql鎖機制
- 介紹
- 演示
- 總結
- 樂觀鎖和悲觀鎖
- 扛得住的mysql
- 實例和故事
- 系統參數優化
- mysql體系結構
- mysql基準測試
- 索引
- mysql的復制
- win配置MySQL主從
- mysql5.7新特性
- 常見問題
- general log
- 忘記密碼
- uodo log與redo log
- 事務隔離級別
- mysql8密碼登錄
- explain
- 高效的Tree表
- on delete cascade 總結
- mongod
- 簡介
- 集合文檔操作語句
- 增刪改查
- 索引
- 數據導入和導出
- 主從復制
- php7操作mongod
- 權限管理
- redis
- redis簡介
- 3.2版本配置文件
- 3.0版本配置文件
- 2.8版本配置文件
- 配置文件總結
- 外網連接
- 持久化
- RDB備份方式保存數據
- AOF備份方式保存數據
- 總結
- win安裝redis和sentinel部署
- 事務
- Sentinel模式配置
- 分布式鎖
- 管道
- php中redis代碼
- 發布訂閱
- slowlog
- Redis4.0
- scan和keys
- elasticsearch
- 配置說明
- 啟動
- kibana
- kibana下載
- kibana配置文件
- kibana常用功能
- 常用術語
- Beats
- Beats簡介
- Filebeat
- Packetbeat
- Logstash
- 配置
- elasticsearch架構
- es1.7
- head和bigdesk插件
- 插件大全
- 倒排索引
- 單模式下API增刪改查
- mget獲取多個文檔
- 批量操作bulk
- 版本控制
- Mapping映射
- 基本查詢
- Filter過濾
- 組合查詢
- es配置文件
- es集群優化和管理
- logstash
- kibana
- es5.2
- 安裝
- 沖突處理
- 數據備份
- 缺陷不足
- 集群管理api
- 分布式事務
- CAP理論
- BASE模型
- 兩階段提交(2PC)
- TCC (Try-Confirm-Cancle)
- 異步確保型
- 最大努力通知型
- 總結