一、內存調優
[root@server-mysql ~]# cat /proc/sys/vm/dirty_background_ratio 10
[root@server-mysql ~]# cat /proc/sys/vm/swappiness 60
swappiness表示使用swap分區的使用程度,可以適當調整swappiness=0的時候表示盡可能使用物理內存swap空間.swappiness=100積極使用swap.
[root@server-mysql ~]# cat /proc/sys/vm/dirty_ratio 20
二、磁盤I/O調優
一)、 概述
- # blockdev --getra /dev/sda
- # blockdev --setra 512 /dev/sda
- # cat /sys/block/sda/queue/nr_requests
- 512
二)、 磁盤I/O的4種調度算法
- # /sys/block/sda/queue/iosched/queued:輪詢時每次處理的最大請求數
- # /sys/block/sda/queue/iosched/quantum:每隔多少個請求數做一次輪詢
- # ionice -c1 -n7 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&
- # ionice -c2 -n3 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&
- # ionice -c3 -n0 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&
- # echo deadline >/sys/block/sda/queue/scheduler
- # more /sys/block/sda/queue/scheduler
- noop anticipatory [deadline] cfq
- # ls /sys/block/sda/queue/iosched/
- fifo_batch front_merges read_expire write_expire writes_starved
- # cat iosched/read_expire
- 500 #默認500ms
- # cat iosched/write_expire
- 5000 #默認5000ms
- # cat iosched/front_merges
- 1
- # echo "anticipatory">/sys/block/sda/queue/scheduler
- # more iosched/antic_expire
- 6 #默認為6秒
- # more /sys/block/sda/queue/iosched/read_expire
- 125 #讀的最大隊列時間
- # more /sys/block/sda/queue/iosched/write_expire
- 250 #寫的最大隊列時間
- 注:測試時一定要清空緩存
- # free –m #查看緩存
- total used free shared buffers cached
- Mem: 4054 506 3548 0 140 256
- -/+ buffers/cache: 108 3945
- Swap: 8189 0 8189
- # sysctl -w vm.drop_caches=3 #清空緩存
- # rpm –ivh elevator-test-0.1-3.i386.rpm #安裝測試軟件
- # dd if=/dev/urandom of=/root/bigfile bs=1M count=100
- # watch –n 1 ls –lh /root/bigfile #每隔一秒查寫入bigfile的數據量
- 默認調度類型為cfq下,測試讀數據速度(測試時要求清空緩存)
- # cat /sys/block/sda/queue/scheduler
- noop anticipatory deadline [cfq]
- et_start reader /root/bigfile
- Launching
- Reading 25600 pages
- Read 20000 pages
- real 0m1.552s
- user 0m0.011s
- sys 0m0.147s
- 將調度類型改為anticipatory,測試讀數據速度(測試時要求清空緩存)
- # echo “anticipatory”>/sys/block/sda/queue/scheduler
- noop anticipatory deadline [anticipatory]
- # cat /sys/block/sda/queue/iosched/antic_expire
-
12 #該值默認為6,為提高速度,改成12et_start reader /root/bigfileLaunchingReading 25600 pagesRead 20000 pagesreal 0m1.456suser 0m0.007ssys 0m0.144s結論:很明顯讀的數度提高了。
4. NOOP(電梯式調度程序)(elevator=noop):
特點:
不做任何調優,主要用於節省CPU資源。
Noop調度算法指的是當請求被存儲到隊列並交由I/O子系統處理時由磁盤硬件對其進行優化。該算法一般只對一些特定的硬件(例如RAM disk和TCQ disk等)。
Noop對於I/O不那么操心,對所有的I/O請求都用FIFO隊列形式處理,默認認為 I/O不會存在性能問題。這也使得CPU也不用那么操心
三)、 I/O調度算法使用建議
1. Deadline I/O scheduler
在這個中 deadline 調度算法通過降低性能而獲得更短的等待時間,它使用輪詢的調度器,簡潔小巧,提供了最小的讀取延遲
和尚佳的吞吐量,特別適合於讀取較多的環境(比如數據庫,Oracle 10G 之類).
2. Anticipatory I/O scheduler
anticipatory 算法通過增加等待時間來獲得更高的性能,假設一個塊設備只有一個物理查找磁頭(例如一個單獨的SATA硬盤),將多個隨機的小寫入流合並成一個大寫入流(相當於給隨機讀寫變順序讀寫), 使用這個原理來使用讀取寫入的延時換取最大的讀取寫入吞吐量.適用於大多數環境,特別是讀取寫入較多的環境,比如文件服務器,Web 應用,App等應用我們可以采納as調度.后面我會教大家怎么調這個的合並的等待時間。
3. CFQ I/O scheduler
這個是 對所有因素也都做了折中而盡量獲得公平性,使用QoS策略為所有任務分配等量的帶寬,避免進程被餓死並實現了較低的延遲,可以認為是上述兩種調度器的折中.適用於有大量進程的多用戶系統。
四、 sysctl.conf參數的調整
- 查看TIME_WAIT的數量
- # netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
- 優化
- # vim /etc/sysctl.conf
- net.ipv4.tcp_syncookies = 1 //開戶SYN Cookies,當出現等待隊列溢出時,啟用cookies來處理,防范少量SYN攻擊
- net.ipv4.tcp_tw_reuse = 1 //開戶重用,允許TIME_WAIT sockets重新用於新的TCP連接
- net.ipv4.tcp_tw_recycle = 1 //開戶TCP連接中TIME_WAIT sockets的快速回收
- net.ipv4.tcp_fin_timeout = 30 //修改TIMEOUT的時間
- net.ipv4.tcp_keepalive_time = 1200 //當keepalive起作用的時候,TCP發送keepalive消息的頻度,缺少是2小時,改為20分鍾
- net.ipv4.ip_local_port_range = 10000 65000 //修改端口范圍,允許更多的連接
- net.ipv4.tcp_max_syn_backlog = 8192 //SYN隊列的長度,默認為1024,加大隊列長度為8192,以容納更多等待連接的網絡連接
- net.ipv4.tcp_max_tw_buckets = 5000 //系統同時保持TIME_WAIT的最大數量,如果超過這個數字,TIME_WAIT將立即被清除
- net.core.netdev_max_backlog = 32768 //每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。
- net.core.somaxconn = 32768 //web應用中listen函數的backlog默認會給我們內核參數的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認為511,所以有必要調整這個值。
- net.ipv4.tcp_wmem = 8192 436600 873200 //TCP寫buffer
- net.ipv4.tcp_rmem = 32768 436600 873200 //TCP讀buffer
- net.inet.tcp.sendspace=65536 //最大的待發送TCP數據緩沖區空間
- net.inet.tcp.recvspace=65536 //最大的接受TCP緩沖區空間
- net.inet.udp.sendspace=65535 //最大的接受UDP緩沖區大小
- net.inet.udp.maxdgram=65535 //最大的發送UDP數據緩沖區大小
- net.local.stream.sendspace=65535 //本地套接字連接的數據發送空間
- 最后使用命令sysctl讓其生效
- # sysctl -p
五、 網絡調優
- 1.安裝軟件
- apt-get install ifenslave
- 2.修改配置文件
- /etc/network/interfaces
- auto lo
- iface lo inet loopback
- iface eth0 inet dhcp
- iface eth1 inet dhcp
- auto bond0
- iface bond0 inet static
- address 64.0.177.20
- netmask 255.255.255.0
- gateway 64.0.177.254
- up ifenslave bond0 eth0 eth1
- down ifenslave -d bond0 eth0 eth1
- 3.加載模塊
- vi /etc/modules
- bonding
六 nginx調優
一)、配置文件調優
- worker_processes 8; //nginx進程數,建議按照cpu數目來指定,一般為它的倍數。
- worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; //為每個進程分配cpu,上例中將8個進程分配到8個cpu,當然可以寫多個,或者將一個進程分配到多個cpu。
- worker_rlimit_nofile 102400; //這個指令是指當一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與nginx進程數相除,但是nginx分配請求並不是那么均勻,所以最好與ulimit -n的值保持一致。
- use epoll; //使用epoll的I/O模型,這個不用說了吧.
- worker_connections 102400; //每個進程允許的最多連接數,理論上每台nginx服務器的最大連接數為worker_processes*worker_connections。
- keepalive_timeout 60; //keepalive超時時間。
- limit_rate_after 2m;
- //限制速度,當用戶請求的文件超過2M的時候,開始限速,限制為128k
- limit_rate 128k;
二)、安裝插件調優
- # tar xnf libunwind-0.99.tar.gz
- # cd libunwind-0.99/
- # CFLAGS=-fPIC ./configure
- # make CFLAGS=-fPIC
- # make CFLAGS=-fPIC install
- # tar xvf google-perftools-1.9.tar.gz
- # cd google-perftools-1.9/
- # ./configure
- # make && make install
- # echo "/usr/local/lib“ >> /etc/ld.so.conf.d/usr_local_lib.conf
- # ldconfig
- # ./configure --with-google_perftools_module --with-http_stub_status_module --with-http_ssl_module --prefix=/usr/local/webserver/nginx
- # make
- # make install
- # mkdir /tmp/tcmalloc
- # chmod 0777 /tmp/tcmalloc
- 修改nginx.conf文件,在pid這行的下面添加如下代碼:
- google_perftools_profiles /tmp/tcmalloc;
- 為了驗證google-perftools已經正常加載,可通過如下命令查看:
- lsof -n | grep tcmalloc