Linux內(nèi)核調(diào)優(yōu)
/etc/sysctl.conf
#系統(tǒng)全局允許分配的最大文件句柄數(shù)
fs.file-max=2097152
fs.nr_open=2097152
#并發(fā)連接backlog
net.ipv4.tcp_max_syn_backlog=16384
net.core.netdev_max_backlog=16384
net.core.somaxconn=32768
#可用知名端口范圍
net.ipv4.ip_local_port_range = 1000 65535
#TCP Socket讀寫B(tài)uffer設(shè)置
net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.core.optmem_max=16777216
net.ipv4.tcp_rmem=1024 4096 16777216
net.ipv4.tcp_wmem=1024 4096 16777216
#TCP連接追蹤設(shè)置
net.nf_conntrack_max=1000000
net.netfilter.nf_conntrack_max=1000000
net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
#TIME-WAIT Socket最大數(shù)量、回收與重用設(shè)置
net.ipv4.tcp_max_tw_buckets=1048576
#FIN-WAIT-2 Socket超時設(shè)置
net.ipv4.tcp_fin_timeout = 15
/etc/security/limits.conf
#持久化設(shè)置允許用戶/進(jìn)程打開文件句柄數(shù)
* soft nofile 1048576
* hard nofile 1048576
mysql/mariaDb配置
遠(yuǎn)程root連接
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '1234' WITH GRANT OPTION;
- 優(yōu)化使用 InnoDB 的緩沖池
InnoDB 引擎在內(nèi)存中有一個緩沖池用于緩存數(shù)據(jù)和索引刻获。這當(dāng)然有助于你更快地執(zhí)行 MySQL/MariaDB 查詢語句赖欣。選擇合適的內(nèi)存大小需要一些重要的決策并對系統(tǒng)的內(nèi)存消耗有較多的認(rèn)識慢蜓。
下面是你需要考慮的:
其它的進(jìn)程需要消耗多少內(nèi)存省艳。這包括你的系統(tǒng)進(jìn)程瓜挽,頁表颁股,套接字緩沖么库。
你的服務(wù)器是否專門用于 MySQL 還是你運(yùn)行著其它非常消耗內(nèi)存的服務(wù)。
在一個專用的機(jī)器上甘有,你可能會把 60-70% 的內(nèi)存分配給 innodb_buffer_pool_size 诉儒。如果你打算在一個機(jī)器上運(yùn)行更多的服務(wù),你應(yīng)該重新考慮專門用于 innodb_buffer_pool_size 的內(nèi)存大小亏掀。
你需要設(shè)置 my.cnf 中的此項(xiàng):
innodb_buffer_pool_size - 在 MySQL 中避免使用 Swappiness
“交換”是一個當(dāng)系統(tǒng)移動部分內(nèi)存到一個稱為 “交換空間” 的特殊磁盤空間時的過程忱反。通常當(dāng)你的系統(tǒng)用完物理內(nèi)存后就會出現(xiàn)這種情況泛释,系統(tǒng)將信息寫入磁盤而不是釋放一些內(nèi)存。正如你猜測的磁盤比你的內(nèi)存要慢得多温算。
該選項(xiàng)默認(rèn)情況下是啟用的:
vm.swappiness = 60
運(yùn)行以下命令關(guān)閉 swappiness:
sysctl -w vm.swappiness=0 - 設(shè)置 MySQL 的最大連接數(shù)
max_connections 指令告訴你當(dāng)前你的服務(wù)器允許多少并發(fā)連接怜校。MySQL/MariaDB 服務(wù)器允許有 SUPER 權(quán)限的用戶在最大連接之外再建立一個連接。只有當(dāng)執(zhí)行 MySQL 請求的時候才會建立連接注竿,執(zhí)行完成后會關(guān)閉連接并被新的連接取代茄茁。
請記住,太多的連接會導(dǎo)致內(nèi)存的使用量過高并且會鎖住你的 MySQL 服務(wù)器巩割。一般小網(wǎng)站需要 100-200 的連接數(shù)裙顽,而較大可能需要 500-800 甚至更多。這里的值很大程度上取決于你 MySQL/MariaDB 的使用情況喂分。
你可以動態(tài)地改變 max_connections 的值而無需重啟MySQL服務(wù)器:
mysql> set global max_connections = 300; - 配置 MySQL 的線程緩存數(shù)量
thread_cache_size 指令用來設(shè)置你服務(wù)器緩存的線程數(shù)量锦庸。當(dāng)客戶端斷開連接時,如果當(dāng)前線程數(shù)小于 thread_cache_size 蒲祈,它的線程將被放入緩存中甘萧。下一個請求通過使用緩存池中的線程來完成。
要提高服務(wù)器的性能梆掸,你可以設(shè)置 thread_cache_size 的值相對高一些扬卷。你可以通過以下方法來查看線程緩存命中率:
mysql> show status like 'Threads_created';
mysql> show status like 'Connections';
你可以用以下公式來計算線程池的命中率:
100 - ((Threads_created / Connections) * 100)
如果你得到一個較低的數(shù)字,這意味著大多數(shù) mysql 連接使用新的線程酸钦,而不是從緩存加載怪得。在這種情況下,你需要增加 thread_cache_size 卑硫。
這里有一個好處是可以動態(tài)地改變 thread_cache_size 而無需重啟 MySQL 服務(wù)徒恋。你可以通過以下方式來實(shí)現(xiàn):
mysql> set global thread_cache_size = 16; - 禁用 MySQL 的 DNS 反向查詢
默認(rèn)情況下當(dāng)新的連接出現(xiàn)時,MySQL/MariaDB 會進(jìn)行 DNS 查詢解析用戶的 IP 地址/主機(jī)名欢伏。對于每個客戶端連接入挣,它的 IP 都會被解析為主機(jī)名。然后硝拧,主機(jī)名又被反解析為 IP 來驗(yàn)證兩者是否一致径筏。
當(dāng) DNS 配置錯誤或服務(wù)器出現(xiàn)問題時,這很可能會導(dǎo)致延遲障陶。這就是為什么要關(guān)閉 DNS 的反向查詢的原因滋恬,你可以在你的配置文件中添加以下選項(xiàng)去設(shè)定:
[mysqld]
skip-name-resolve
更改后你需要重啟 MySQL 服務(wù)。 - 配置 MySQL 的查詢緩存容量
如果你有很多重復(fù)的查詢并且數(shù)據(jù)不經(jīng)常改變 – 請使用緩存查詢抱究。 人們常常不理解 query_cache_size 的實(shí)際含義而將此值設(shè)置為 GB 級恢氯,這實(shí)際上會降低服務(wù)器的性能。
背后的原因是,在更新過程中線程需要鎖定緩存酿雪。通常設(shè)置為 200-300 MB應(yīng)該足夠了遏暴。如果你的網(wǎng)站比較小的,你可以嘗試給 64M 并在以后及時去增加指黎。
在你的 MySQL 配置文件中添加以下設(shè)置:
query_cache_type = 1
query_cache_limit = 256K
query_cache_min_res_unit = 2k
query_cache_size = 80M - 配置臨時表容量和內(nèi)存表最大容量
tmp_table_size 和 max_heap_table_size 這兩個變量的大小應(yīng)該相同,它們可以讓你避免磁盤寫入州丹。 tmp_table_size 是內(nèi)置內(nèi)存表的最大空間醋安。如果表的大小超出限值將會被轉(zhuǎn)換為磁盤上的 MyISAM 表。
這會影響數(shù)據(jù)庫的性能墓毒。管理員通常建議在服務(wù)器上設(shè)置這兩個值為每 GB 內(nèi)存給 64M吓揪。
[mysqld]
tmp_table_size= 64M
max_heap_table_size= 64M - 啟用 MySQL 慢查詢?nèi)罩?br>
記錄慢查詢可以幫助你定位數(shù)據(jù)庫中的問題并幫助你調(diào)試。這可以通過在你的 MySQL 配置文件中添加以下值來啟用:
slow-query-log = 1
slow-query-log-file = /var/lib/mysql/mysql-slow.log
long_query_time = 1
第一個變量啟用慢查詢?nèi)罩舅疲诙€告訴 MySQL 實(shí)際的日志文件存儲位置柠辞。使用 long_query_time 來定義完成 MySQL 查詢多少用時算長。 - 檢查 MySQL 的空閑連接
空閑連接會消耗資源主胧,可以的話應(yīng)該被終止或者刷新叭首。空閑連接是指處于 “sleep” 狀態(tài)并且保持了很長一段時間的連接踪栋。你可以通過運(yùn)行以下命令查看空閑連接:
mysqladmin processlist -u root -p | grep “Sleep”
這會顯示處于睡眠狀態(tài)的進(jìn)程列表焙格。當(dāng)代碼使用持久連接到數(shù)據(jù)庫時會出現(xiàn)這種情況。使用 PHP 調(diào)用 mysql_pconnect 可以打開這個連接夷都,執(zhí)行完查詢之后眷唉,刪除認(rèn)證信息并保持連接為打開狀態(tài)。這會導(dǎo)致每個線程的緩沖都被保存在內(nèi)存中囤官,直到該線程結(jié)束冬阳。
首先你要做的就是檢查代碼問題并修復(fù)它。如果你不能訪問正在運(yùn)行的代碼党饮,你可以修改 wait_timeout 變量肝陪。默認(rèn)值是 28800 秒,而你可以安全地將其降低到 60 :
wait_timeout=60 - 設(shè)置 MySQL 允許的最大數(shù)據(jù)包
MySQL 把數(shù)據(jù)拆分成包劫谅。通常一個包就是發(fā)送到客戶端的一行數(shù)據(jù)见坑。 max_allowed_pa cket 變量定義了可以被發(fā)送的最大的包。
此值設(shè)置得過低可能會導(dǎo)致查詢速度變得非常慢捏检,然后你會在 MySQL 的錯誤日志看到一個錯誤荞驴。建議將該值設(shè)置為最大包的大小。 - 測試 MySQL 的性能優(yōu)化
你應(yīng)該定期檢查 MySQL/MariaDB 的性能贯城。這將幫助你了解資源的使用情況是否發(fā)生了改變或需要進(jìn)行改進(jìn)熊楼。有大量的測試工具可用,但我推薦你一個簡單易用的。該工具被稱為 mysqltuner鲫骗。
使用下面的命令下載并運(yùn)行它:
# wget https://github.com/major/MySQLTuner-perl/tarball/master
# tar xf master
# cd major-MySQLTuner-perl-993bc18/
# ./mysqltuner.pl
MYSQL服務(wù)器my.cnf配置文檔詳解
硬件:內(nèi)存16G
[client]
port = 3306
socket = /data/3306/mysql.sock
[mysql]
no-auto-rehash
[mysqld]
user = mysql
port = 3306
socket = /data/3306/mysql.sock
basedir = /usr/local/mysql
datadir = /data/3306/data
open_files_limit = 10240
back_log = 600
#在MYSQL暫時停止響應(yīng)新請求之前犬耻,短時間內(nèi)的多少個請求可以被存在堆棧中。如果系統(tǒng)在短時間內(nèi)有很多連接执泰,則需要增大該參數(shù)的值枕磁,該參數(shù)值指定到來的TCP/IP連接的監(jiān)聽隊(duì)列的大小。默認(rèn)值50术吝。
max_connections = 3000
#MySQL允許最大的進(jìn)程連接數(shù)计济,如果經(jīng)常出現(xiàn)Too Many Connections的錯誤提示,則需要增大此值排苍。
max_connect_errors = 6000
#設(shè)置每個主機(jī)的連接請求異常中斷的最大次數(shù)沦寂,當(dāng)超過該次數(shù),MYSQL服務(wù)器將禁止host的連接請求淘衙,直到mysql服務(wù)器重啟或通過flush hosts命令清空此host的相關(guān)信息传藏。
table_cache = 614
#指示表調(diào)整緩沖區(qū)大小。# table_cache 參數(shù)設(shè)置表高速緩存的數(shù)目彤守。每個連接進(jìn)來毯侦,都會至少打開一個表緩存。#因此遗增, table_cache 的大小應(yīng)與 max_connections 的設(shè)置有關(guān)叫惊。例如,對于 200 個#并行運(yùn)行的連接做修,應(yīng)該讓表的緩存至少有 200 × N 霍狰,這里 N 是應(yīng)用可以執(zhí)行的查詢#的一個聯(lián)接中表的最大數(shù)量。此外饰及,還需要為臨時表和文件保留一些額外的文件描述符蔗坯。
# 當(dāng) Mysql 訪問一個表時,如果該表在緩存中已經(jīng)被打開燎含,則可以直接訪問緩存宾濒;如果#還沒有被緩存,但是在 Mysql 表緩沖區(qū)中還有空間屏箍,那么這個表就被打開并放入表緩#沖區(qū)绘梦;如果表緩存滿了,則會按照一定的規(guī)則將當(dāng)前未用的表釋放赴魁,或者臨時擴(kuò)大表緩存來存放卸奉,使用表緩存的好處是可以更快速地訪問表中的內(nèi)容。執(zhí)行 flush tables 會#清空緩存的內(nèi)容颖御。一般來說榄棵,可以通過查看數(shù)據(jù)庫運(yùn)行峰值時間的狀態(tài)值 Open_tables #和 Opened_tables ,判斷是否需要增加 table_cache 的值(其中 open_tables 是當(dāng)#前打開的表的數(shù)量, Opened_tables 則是已經(jīng)打開的表的數(shù)量)疹鳄。即如果open_tables接近table_cache的時候拧略,并且Opened_tables這個值在逐步增加,那就要考慮增加這個#值的大小了瘪弓。還有就是Table_locks_waited比較高的時候垫蛆,也需要增加table_cache。
external-locking = FALSE
#使用–skip-external-locking MySQL選項(xiàng)以避免外部鎖定腺怯。該選項(xiàng)默認(rèn)開啟
max_allowed_packet = 32M
#設(shè)置在網(wǎng)絡(luò)傳輸中一次消息傳輸量的最大值月褥。系統(tǒng)默認(rèn)值 為1MB,最大值是1GB瓢喉,必須設(shè)置1024的倍數(shù)。
sort_buffer_size = 2M
# Sort_Buffer_Size 是一個connection級參數(shù)舀透,在每個connection(session)第一次需要使用這個buffer的時候栓票,一次性分配設(shè)置的內(nèi)存。
#Sort_Buffer_Size 并不是越大越好愕够,由于是connection級的參數(shù)走贪,過大的設(shè)置+高并發(fā)可能會耗盡系統(tǒng)內(nèi)存資源。例如:500個連接將會消耗 500*sort_buffer_size(8M)=4G內(nèi)存
#Sort_Buffer_Size 超過2KB的時候惑芭,就會使用mmap() 而不是 malloc() 來進(jìn)行內(nèi)存分配坠狡,導(dǎo)致效率降低。
#技術(shù)導(dǎo)讀 http://blog.webshuo.com/2011/02/16/mysql-sort_buffer_size/
#dev-doc: http://dev.mysql.com/doc/refman/5.5/en/server-parameters.html
#explain select*from table where order limit遂跟;出現(xiàn)filesort
#屬重點(diǎn)優(yōu)化參數(shù)
join_buffer_size = 2M
#用于表間關(guān)聯(lián)緩存的大小逃沿,和sort_buffer_size一樣,該參數(shù)對應(yīng)的分配內(nèi)存也是每個連接獨(dú)享幻锁。
thread_cache_size = 300
# 服務(wù)器線程緩存這個值表示可以重新利用保存在緩存中線程的數(shù)量,當(dāng)斷開連接時如果緩存中還有空間,那么客戶端的線程將被放到緩存中,如果線程重新被請求凯亮,那么請求將從緩存中讀取,如果緩存中是空的或者是新的請求,那么這個線程將被重新創(chuàng)建,如果有很多新的線程哄尔,增加這個值可以改善系統(tǒng)性能.通過比較 Connections 和 Threads_created 狀態(tài)的變量假消,可以看到這個變量的作用。設(shè)置規(guī)則如下:1GB 內(nèi)存配置為8岭接,2GB配置為16富拗,3GB配置為32,4GB或更高內(nèi)存鸣戴,可配置更大啃沪。
thread_concurrency = 8
# 設(shè)置thread_concurrency的值的正確與否, 對mysql的性能影響很大, 在多個cpu(或多核)的情況下,錯誤設(shè)置了thread_concurrency的值, 會導(dǎo)致mysql不能充分利用多cpu(或多核), 出現(xiàn)同一時刻只能一個cpu(或核)在工作的情況葵擎。thread_concurrency應(yīng)設(shè)為CPU核數(shù)的2倍. 比如有一個雙核的CPU, 那么thread_concurrency的應(yīng)該為4; 2個雙核的cpu, thread_concurrency的值應(yīng)為8
#屬重點(diǎn)優(yōu)化參數(shù)
query_cache_size = 64M
## 對于使用MySQL的用戶谅阿,對于這個變量大家一定不會陌生。前幾年的MyISAM引擎優(yōu)化中,這個參數(shù)也是一個重要的優(yōu)化參數(shù)签餐。但隨著發(fā)展寓涨,這個參數(shù)也爆露出來一些問題。機(jī)器的內(nèi)存越來越大氯檐,人們也都習(xí)慣性的把以前有用的參數(shù)分配的值越來越大戒良。這個參數(shù)加大后也引發(fā)了一系列問題。我們首先分析一下 query_cache_size的工作原理:一個SELECT查詢在DB中工作后冠摄,DB會把該語句緩存下來糯崎,當(dāng)同樣的一個SQL再次來到DB里調(diào)用時,DB在該表沒發(fā)生變化的情況下把結(jié)果從緩存中返回給Client河泳。這里有一個關(guān)建點(diǎn)沃呢,就是DB在利用Query_cache工作時,要求該語句涉及的表在這段時間內(nèi)沒有發(fā)生變更拆挥。那如果該表在發(fā)生變更時薄霜,Query_cache里的數(shù)據(jù)又怎么處理呢?首先要把Query_cache和該表相關(guān)的語句全部置為失效纸兔,然后在寫入更新惰瓜。那么如果Query_cache非常大,該表的查詢結(jié)構(gòu)又比較多汉矿,查詢語句失效也慢崎坊,一個更新或是Insert就會很慢,這樣看到的就是Update或是Insert怎么這么慢了洲拇。所以在數(shù)據(jù)庫寫入量或是更新量也比較大的系統(tǒng)奈揍,該參數(shù)不適合分配過大。而且在高并發(fā)呻待,寫入量大的系統(tǒng)打月,建議把該功能禁掉。
#重點(diǎn)優(yōu)化參數(shù)(主庫 增刪改-MyISAM)
query_cache_limit = 4M
#指定單個查詢能夠使用的緩沖區(qū)大小蚕捉,缺省為1M
query_cache_min_res_unit = 2k
#默認(rèn)是4KB奏篙,設(shè)置值大對大數(shù)據(jù)查詢有好處,但如果你的查詢都是小數(shù)據(jù)查詢迫淹,就容易造成內(nèi)存碎片和浪費(fèi)
#查詢緩存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
#如果查詢緩存碎片率超過20%秘通,可以用FLUSH QUERY CACHE整理緩存碎片,或者試試減小query_cache_min_res_unit敛熬,如果你的查詢都是小數(shù)據(jù)量的話肺稀。
#查詢緩存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size * 100%
#查詢緩存利用率在25%以下的話說明query_cache_size設(shè)置的過大,可適當(dāng)減小;查詢緩存利用率在80%以上而且Qcache_lowmem_prunes > 50的話說明query_cache_size可能有點(diǎn)小应民,要不就是碎片太多话原。
#查詢緩存命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%
default-storage-engine = MyISAM
#default_table_type = InnoDB
thread_stack = 192K
#設(shè)置MYSQL每個線程的堆棧大小夕吻,默認(rèn)值足夠大,可滿足普通操作繁仁∩嫦冢可設(shè)置范圍為128K至4GB,默認(rèn)為192KB黄虱。
transaction_isolation = READ-COMMITTED
# 設(shè)定默認(rèn)的事務(wù)隔離級別.可用的級別如下:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
# 1.READ UNCOMMITTED-讀未提交2.READ COMMITTE-讀已提交3.REPEATABLE READ -可重復(fù)讀4.SERIALIZABLE -串行
tmp_table_size = 256M
# tmp_table_size 的默認(rèn)大小是 32M稚矿。如果一張臨時表超出該大小,MySQL產(chǎn)生一個 The table tbl_name is full 形式的錯誤捻浦,如果你做很多高級 GROUP BY 查詢晤揣,增加 tmp_table_size 值。如果超過該值朱灿,則會將臨時表寫入磁盤昧识。
max_heap_table_size = 256M
long_query_time = 2
log_long_format
log-slow-queries=/data/3306/slow-log.log
#log-bin = /data/3306/mysql-bin
log-bin
binlog_cache_size = 4M
max_binlog_cache_size = 8M
max_binlog_size = 512M
expire_logs_days = 7
key_buffer_size = 2048M
#批定用于索引的緩沖區(qū)大小,增加它可以得到更好的索引處理性能盗扒,對于內(nèi)存在4GB左右的服務(wù)器來說滞诺,該參數(shù)可設(shè)置為256MB或384MB。
read_buffer_size = 1M
# MySql讀入緩沖區(qū)大小环疼。對表進(jìn)行順序掃描的請求將分配一個讀入緩沖區(qū),MySql會為它分配一段內(nèi)存緩沖區(qū)朵耕。read_buffer_size變量控制這一緩沖區(qū)的大小炫隶。如果對表的順序掃描請求非常頻繁,并且你認(rèn)為頻繁掃描進(jìn)行得太慢阎曹,可以通過增加該變量值以及內(nèi)存緩沖區(qū)大小提高其性能伪阶。和sort_buffer_size一樣,該參數(shù)對應(yīng)的分配內(nèi)存也是每個連接獨(dú)享处嫌。
read_rnd_buffer_size = 16M
# MySql的隨機(jī)讀(查詢操作)緩沖區(qū)大小栅贴。當(dāng)按任意順序讀取行時(例如,按照排序順序)熏迹,將分配一個隨機(jī)讀緩存區(qū)檐薯。進(jìn)行排序查詢時,MySql會首先掃描一遍該緩沖注暗,以避免磁盤搜索坛缕,提高查詢速度,如果需要排序大量數(shù)據(jù)捆昏,可適當(dāng)調(diào)高該值赚楚。但MySql會為每個客戶連接發(fā)放該緩沖空間,所以應(yīng)盡量適當(dāng)設(shè)置該值骗卜,以避免內(nèi)存開銷過大宠页。
bulk_insert_buffer_size = 64M
#批量插入數(shù)據(jù)緩存大小左胞,可以有效提高插入效率,默認(rèn)為8M
myisam_sort_buffer_size = 128M
# MyISAM表發(fā)生變化時重新排序所需的緩沖
myisam_max_sort_file_size = 10G
# MySQL重建索引時所允許的最大臨時文件的大小 (當(dāng) REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).
# 如果文件大小比此值更大,索引會通過鍵值緩沖創(chuàng)建(更慢)
myisam_max_extra_sort_file_size = 10G
myisam_repair_threads = 1
# 如果一個表擁有超過一個索引, MyISAM 可以通過并行排序使用超過一個線程去修復(fù)他們.
# 這對于擁有多個CPU以及大量內(nèi)存情況的用戶,是一個很好的選擇.
myisam_recover
#自動檢查和修復(fù)沒有適當(dāng)關(guān)閉的 MyISAM 表
skip-name-resolve
lower_case_table_names = 1
server-id = 1
innodb_additional_mem_pool_size = 16M
#這個參數(shù)用來設(shè)置 InnoDB 存儲的數(shù)據(jù)目錄信息和其它內(nèi)部數(shù)據(jù)結(jié)構(gòu)的內(nèi)存池大小举户,類似于Oracle的library cache烤宙。這不是一個強(qiáng)制參數(shù),可以被突破敛摘。
innodb_buffer_pool_size = 2048M
# 這對Innodb表來說非常重要门烂。Innodb相比MyISAM表對緩沖更為敏感。MyISAM可以在默認(rèn)的 key_buffer_size 設(shè)置下運(yùn)行的可以兄淫,然而Innodb在默認(rèn)的 innodb_buffer_pool_size 設(shè)置下卻跟蝸牛似的屯远。由于Innodb把數(shù)據(jù)和索引都緩存起來,無需留給操作系統(tǒng)太多的內(nèi)存捕虽,因此如果只需要用Innodb的話則可以設(shè)置它高達(dá) 70-80% 的可用內(nèi)存慨丐。一些應(yīng)用于 key_buffer 的規(guī)則有 — 如果你的數(shù)據(jù)量不大,并且不會暴增泄私,那么無需把 innodb_buffer_pool_size 設(shè)置的太大了
innodb_data_file_path = ibdata1:1024M:autoextend
#表空間文件 重要數(shù)據(jù)
innodb_file_io_threads = 4
#文件IO的線程數(shù)房揭,一般為 4,但是在 Windows 下晌端,可以設(shè)置得較大捅暴。
innodb_thread_concurrency = 8
#服務(wù)器有幾個CPU就設(shè)置為幾,建議用默認(rèn)設(shè)置咧纠,一般為8.
innodb_flush_log_at_trx_commit = 2
# 如果將此參數(shù)設(shè)置為1蓬痒,將在每次提交事務(wù)后將日志寫入磁盤。為提供性能漆羔,可以設(shè)置為0或2梧奢,但要承擔(dān)在發(fā)生故障時丟失數(shù)據(jù)的風(fēng)險。設(shè)置為0表示事務(wù)日志寫入日志文件演痒,而日志文件每秒刷新到磁盤一次亲轨。設(shè)置為2表示事務(wù)日志將在提交時寫入日志,但日志文件每次刷新到磁盤一次鸟顺。
innodb_log_buffer_size = 16M
#此參數(shù)確定些日志文件所用的內(nèi)存大小惦蚊,以M為單位。緩沖區(qū)更大能提高性能讯嫂,但意外的故障將會丟失數(shù)據(jù).MySQL開發(fā)人員建議設(shè)置為1-8M之間
innodb_log_file_size = 128M
#此參數(shù)確定數(shù)據(jù)日志文件的大小养筒,以M為單位,更大的設(shè)置可以提高性能端姚,但也會增加恢復(fù)故障數(shù)據(jù)庫所需的時間
innodb_log_files_in_group = 3
#為提高性能晕粪,MySQL可以以循環(huán)方式將日志文件寫到多個文件。推薦設(shè)置為3M
innodb_max_dirty_pages_pct = 90
#推薦閱讀 http://www.taobaodba.com/html/221_innodb_max_dirty_pages_pct_checkpoint.html
# Buffer_Pool中Dirty_Page所占的數(shù)量渐裸,直接影響InnoDB的關(guān)閉時間巫湘。參數(shù)innodb_max_dirty_pages_pct 可以直接控制了Dirty_Page在Buffer_Pool中所占的比率装悲,而且幸運(yùn)的是innodb_max_dirty_pages_pct是可以動態(tài)改變的。所以尚氛,在關(guān)閉InnoDB之前先將innodb_max_dirty_pages_pct調(diào)小诀诊,強(qiáng)制數(shù)據(jù)塊Flush一段時間,則能夠大大縮短 MySQL關(guān)閉的時間阅嘶。
innodb_lock_wait_timeout = 120
# InnoDB 有其內(nèi)置的死鎖檢測機(jī)制属瓣,能導(dǎo)致未完成的事務(wù)回滾。但是讯柔,如果結(jié)合InnoDB使用MyISAM的lock tables 語句或第三方事務(wù)引擎,則InnoDB無法識別死鎖抡蛙。為消除這種可能性,可以將innodb_lock_wait_timeout設(shè)置為一個整數(shù)值魂迄,指示 MySQL在允許其他事務(wù)修改那些最終受事務(wù)回滾的數(shù)據(jù)之前要等待多長時間(秒數(shù))
innodb_file_per_table = 0
#獨(dú)享表空間(關(guān)閉)
[mysqldump]
quick
max_allowed_packet = 32M
[mysqld_safe]
log-error=/data/3306/mysql_oldboy.err
pid-file=/data/3306/mysqld.pid
#補(bǔ)充
#wait_timeout = 10
#指定一個請求的最大連接時間粗截,對于4GB左右的內(nèi)存服務(wù)器來說,可以將其設(shè)置為5-10捣炬。
#skip_networking
#開啟該選可以徹底關(guān)閉MySQL的TCP/IP連接方式熊昌,如果WEB服務(wù)器是以遠(yuǎn)程連接的方式訪問MYSQL數(shù)據(jù)庫服務(wù)器的,則不要開啟該選項(xiàng)湿酸,否則將無法正常連接婿屹。
#log-queries-not-using-indexes
將沒有使用索引的查詢也記錄下來
windows下設(shè)置utf8mb4
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
nginx 配置調(diào)優(yōu)
#使用用戶為root
user root
#nginx對外提供web服務(wù)時的worker進(jìn)程數(shù)。最優(yōu)值取決于許多因素推溃,包括(但不限于)CPU核的數(shù)量选泻、存儲數(shù)據(jù)的硬盤數(shù)量及負(fù)載模式,設(shè)置為“auto”將嘗試自動檢測它
worker_processes auto;
#更改worker進(jìn)程的最大打開文件數(shù)限制美莫。如果沒設(shè)置的話,這個值為操作系統(tǒng)的限制梯捕。設(shè)置后你的操作系統(tǒng)和Nginx可以處理比“ulimit -a”更多的文件厢呵,所以把這個值設(shè)高,這樣nginx就不會有“too many open files”問題
worker_rlimit_nofile 100000;
#Events模塊
events {
#設(shè)置可由一個worker進(jìn)程同時打開的最大連接數(shù)
worker_connections 65535;
#收到一個新連接通知后接受盡可能多的連接
multi_accept on;
}
#HTTP 模塊
http {
#關(guān)閉在錯誤頁面中的nginx版本數(shù)字
server_tokens off;
#可以讓sendfile()發(fā)揮作用傀顾。sendfile()可以在磁盤和TCP socket之間互相拷貝數(shù)據(jù)(或任意兩個文件描述符)
sendfile on;
#在一個數(shù)據(jù)包里發(fā)送所有頭文件襟铭,而不一個接一個的發(fā)送
tcp_nopush on;
#不要緩存數(shù)據(jù),而是一段一段的發(fā)送
tcp_nodelay on;
#關(guān)閉存儲訪問日志
access_log off;
#給客戶端分配keep-alive鏈接超時時間短曾,設(shè)置低些可以讓ngnix持續(xù)工作的時間更長
keepalive_timeout 10;
#請求頭超時時間
client_header_timeout 10;
#請求體超時時間
client_body_timeout 10;
#關(guān)閉不響應(yīng)的客戶端連接寒砖,釋放內(nèi)存空間
reset_timedout_connection on;
#指定客戶端的響應(yīng)超時時間
send_timeout 10;
#設(shè)置用于保存各種key(比如當(dāng)前連接數(shù))的共享內(nèi)存的參數(shù)。5m就是5兆字節(jié)嫉拐,這個值應(yīng)該被設(shè)置的足夠大以存儲(32K*5)32byte狀態(tài)或者(16K*5)64byte狀態(tài)
limit_conn_zone $binary_remote_addr zone=addr:5m;
#為給定的key設(shè)置最大連接數(shù)哩都。這里key是addr,允許每一個IP地址最多同時打開有100個連接婉徘。
limit_conn addr 100;
#開啟gzip壓縮
gzip on;
gzip_disable "msie6";
# gzip_static on;
#允許或者禁止壓縮基于請求和響應(yīng)的響應(yīng)流漠嵌。設(shè)置為any將會壓縮所有的請求
gzip_proxied any;
#設(shè)置對數(shù)據(jù)啟用壓縮的最少字節(jié)數(shù)
gzip_min_length 1000;
#設(shè)置數(shù)據(jù)的壓縮等級咐汞,1-9之間的任意數(shù)值
gzip_comp_level 4;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
#打開緩存的同時也指定了緩存最大數(shù)目,以及緩存的時間儒鹿。設(shè)置一個相對高的最大時間化撕,可以在它們不活動超過20秒后清除掉。
open_file_cache max=100000 inactive=20s;
#指定檢測正確信息的間隔時間
open_file_cache_valid 30s;
#指令參數(shù)不活動時間期間里最小的文件數(shù)
open_file_cache_min_uses 2;
#當(dāng)搜索一個文件時是否緩存錯誤信息
open_file_cache_errors on;
}
TOMCAT調(diào)優(yōu)
JVM優(yōu)化
Tomcat本身還是運(yùn)行在JVM上的约炎,通過對JVM參數(shù)的調(diào)整我們可以使Tomcat擁有更好的性能植阴。針對JVM的優(yōu)化目前主要在兩個方面:
內(nèi)存調(diào)優(yōu)
內(nèi)存方式的設(shè)置是在catalina.sh中,調(diào)整一下JAVA_OPTS變量即可圾浅,因?yàn)楹竺娴膯訁?shù)會把JAVA_OPTS作為JVM的啟動參數(shù)來處理掠手。
具體設(shè)置如下:
JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4"
其各項(xiàng)參數(shù)如下:
-Xmx3550m:設(shè)置JVM最大可用內(nèi)存為3550M。
-Xms3550m:設(shè)置JVM促使內(nèi)存為3550m贱傀。此值可以設(shè)置與-Xmx相同惨撇,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。
-Xmn2g:設(shè)置年輕代大小為2G府寒。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小魁衙。持久代一般固定大小為64m,所以增大年輕代后株搔,將會減小年老代大小剖淀。此值對系統(tǒng)性能影響較大,Sun官方推薦配置為整個堆的3/8纤房。
-Xss128k:設(shè)置每個線程的堆棧大小纵隔。JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K炮姨。更具應(yīng)用的線程所需內(nèi)存大小進(jìn)行調(diào)整捌刮。在相同物理內(nèi)存下,減小這個值能生成更多的線程舒岸。但是操作系統(tǒng)對一個進(jìn)程內(nèi)的線程數(shù)還是有限制的绅作,不能無限生成,經(jīng)驗(yàn)值在3000~5000左右蛾派。
-XX:NewRatio=4:設(shè)置年輕代(包括Eden和兩個Survivor區(qū))與年老代的比值(除去持久代)俄认。設(shè)置為4,則年輕代與年老代所占比值為1:4洪乍,年輕代占整個堆棧的1/5
-XX:SurvivorRatio=4:設(shè)置年輕代中Eden區(qū)與Survivor區(qū)的大小比值眯杏。設(shè)置為4,則兩個Survivor區(qū)與一個Eden區(qū)的比值為2:4壳澳,一個Survivor區(qū)占整個年輕代的1/6
-XX:MaxPermSize=16m:設(shè)置持久代大小為16m岂贩。
-XX:MaxTenuringThreshold=0:設(shè)置垃圾最大年齡。如果設(shè)置為0的話巷波,則年輕代對象不經(jīng)過Survivor區(qū)河闰,直接進(jìn)入年老代科平。對于年老代比較多的應(yīng)用,可以提高效率姜性。如果將此值設(shè)置為一個較大值瞪慧,則年輕代對象會在Survivor區(qū)進(jìn)行多次復(fù)制,這樣可以增加對象再年輕代的存活時間部念,增加在年輕代即被回收的概論弃酌。垃圾回收策略調(diào)優(yōu)
垃圾回收的設(shè)置也是在catalina.sh中,調(diào)整JAVA_OPTS變量儡炼。
具體設(shè)置如下:
JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100"
具體的垃圾回收策略及相應(yīng)策略的各項(xiàng)參數(shù)如下:
串行收集器(JDK1.5以前主要的回收方式)
-XX:+UseSerialGC:設(shè)置串行收集器
并行收集器(吞吐量優(yōu)先)
示例:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100
-XX:+UseParallelGC:選擇垃圾收集器為并行收集器妓湘。此配置僅對年輕代有效。即上述配置下乌询,年輕代使用并發(fā)收集榜贴,而年老代仍舊使用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的線程數(shù)妹田,即:同時多少個線程一起進(jìn)行垃圾回收唬党。此值最好配置與處理器數(shù)目相等。
-XX:+UseParallelOldGC:配置年老代垃圾收集方式為并行收集鬼佣。JDK6.0支持對年老代并行收集
-XX:MaxGCPauseMillis=100:設(shè)置每次年輕代垃圾回收的最長時間驶拱,如果無法滿足此時間,JVM會自動調(diào)整年輕代大小晶衷,以滿足此值蓝纲。
-XX:+UseAdaptiveSizePolicy:設(shè)置此選項(xiàng)后,并行收集器會自動選擇年輕代區(qū)大小和相應(yīng)的Survivor區(qū)比例晌纫,以達(dá)到目標(biāo)系統(tǒng)規(guī)定的最低相應(yīng)時間或者收集頻率等税迷,此值建議使用并行收集器時,一直打開锹漱。
并發(fā)收集器(響應(yīng)時間優(yōu)先)
示例:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC
-XX:+UseConcMarkSweepGC:設(shè)置年老代為并發(fā)收集箭养。測試中配置這個以后,-XX:NewRatio=4的配置失效了凌蔬,原因不明。所以闯冷,此時年輕代大小最好用-Xmn設(shè)置砂心。
-XX:+UseParNewGC: 設(shè)置年輕代為并行收集∩咭可與CMS收集同時使用辩诞。JDK5.0以上,JVM會根據(jù)系統(tǒng)配置自行設(shè)置纺涤,所以無需再設(shè)置此值译暂。
-XX:CMSFullGCsBeforeCompaction:由于并發(fā)收集器不對內(nèi)存空間進(jìn)行壓縮抠忘、整理,所以運(yùn)行一段時間以后會產(chǎn)生“碎片”外永,使得運(yùn)行效率降低崎脉。此值設(shè)置運(yùn)行多少次GC以后對內(nèi)存空間進(jìn)行壓縮屈尼、整理蜕衡。
-XX:+UseCMSCompactAtFullCollection:打開對年老代的壓縮『谝悖可能會影響性能祭衩,但是可以消除碎片小結(jié)
1)內(nèi)存越大灶体,一般情況下處理的效率也越高,但同時在做垃圾回收的時候所需要的時間也就越長掐暮,在這段時間內(nèi)的處理效率是必然要受影響的蝎抽。
2)在大多數(shù)的網(wǎng)絡(luò)文章中都推薦 Xmx和Xms設(shè)置為一致,說是避免頻繁的回收路克,這個在測試的時候沒有看到明顯的效果樟结,內(nèi)存的占用情況基本都是鋸齒狀的效果,所以這個還要根據(jù)實(shí)際情況來定衷戈。
Server.xml的Connection優(yōu)化
Tomcat的Connector是Tomcat接收HTTP請求的關(guān)鍵模塊狭吼,我們可以配置它來指定IO模式,以及處理通過這個Connector接受到的請求的處理線程數(shù)以及其它一些常用的HTTP策略殖妇。其主要配置參數(shù)如下:
指定使用NIO模型來接受HTTP請求
protocol="org.apache.coyote.http11.Http11NioProtocol" 指定使用NIO模型來接受HTTP請求刁笙。默認(rèn)是BlockingIO,配置為protocol="HTTP/1.1"
acceptorThreadCount="2" 使用NIO模型時接收線程的數(shù)目指定使用線程池來處理HTTP請求
首先配置一個線程池來處理請求(與Connector是平級的谦趣,多個Connector可以使用同一個線程池來處理請求)
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="50" maxIdleTime="600000"/>
<Connector port="8080" executor="tomcatThreadPool"/> 指定使用的線程池指定BlockingIO模式下的處理線程數(shù)目
maxThreads="150"http://Tomcat使用線程來處理接收的每個請求疲吸。這個值表示Tomcat可創(chuàng)建的最大的線程數(shù)。默認(rèn)值200前鹅≌玻可以根據(jù)機(jī)器的時期性能和內(nèi)存大小調(diào)整,一般可以在400-500舰绘。最大可以在800左右蹂喻。
minSpareThreads="25"---Tomcat初始化時創(chuàng)建的線程數(shù)。默認(rèn)值4捂寿。如果當(dāng)前沒有空閑線程口四,且沒有超過maxThreads,一次性創(chuàng)建的空閑線程數(shù)量秦陋。Tomcat初始化時創(chuàng)建的線程數(shù)量也由此值設(shè)置蔓彩。
maxSpareThreads="75"--一旦創(chuàng)建的線程超過這個值,Tomcat就會關(guān)閉不再需要的socket線程。默認(rèn)值50赤嚼。一旦創(chuàng)建的線程超過此數(shù)值旷赖,Tomcat會關(guān)閉不再需要的線程。線程數(shù)可以大致上用 “同時在線人數(shù)每秒用戶操作次數(shù)系統(tǒng)平均操作時間” 來計算更卒。
acceptCount="100"----指定當(dāng)所有可以使用的處理請求的線程數(shù)都被使用時等孵,可以放到處理隊(duì)列中的請求數(shù),超過這個數(shù)的請求將不予處理逞壁。默認(rèn)值10流济。如果當(dāng)前可用線程數(shù)為0,則將請求放入處理隊(duì)列中腌闯。這個值限定了請求隊(duì)列的大小绳瘟,超過這個數(shù)值的請求將不予處理。
connectionTimeout="20000" --網(wǎng)絡(luò)連接超時姿骏,默認(rèn)值20000糖声,單位:毫秒。設(shè)置為0表示永不超時分瘦,這樣設(shè)置有隱患的蘸泻。通常可設(shè)置為30000毫秒嘲玫。其它常用設(shè)置
maxHttpHeaderSize="8192" http請求頭信息的最大程度悦施,超過此長度的部分不予處理。一般8K去团。
URIEncoding="UTF-8" 指定Tomcat容器的URL編碼格式抡诞。
disableUploadTimeout="true" 上傳時是否使用超時機(jī)制
enableLookups="false"--是否反查域名,默認(rèn)值為true土陪。為了提高處理能力昼汗,應(yīng)設(shè)置為false
compression="on" 打開壓縮功能
compressionMinSize="10240" 啟用壓縮的輸出內(nèi)容大小,默認(rèn)為2KB
noCompressionUserAgents="gozilla, traviata" 對于以下的瀏覽器鬼雀,不啟用壓縮
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些資源類型需要壓縮配置示例
<Connector port="8080"
redirectPort="8443"
maxThreads="150"
minSpareThreads="25"
maxSpareThreads="75"
acceptCount="100"
connectionTimeout="20000"
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
URIEncoding="UTF-8"
disableUploadTimeout="true"
enableLookups="false" >
...
</Connector>