内核支持的四种IO调度算法
# cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
cfq 完全公平IO调度算法。内核会为每个进程都维护一个IO队列,内核每次都从每个进程IO队列执行一个IO,然后再去执行下一个进程队列中的IO,如此循环。
anticipatory 预读算法。旧版内核默认算法。比较适合比较缓慢的存储设备。当内核选择了一个IO去执行后,他会消耗大约2毫秒时间去思考后面会继续有哪些IO,这些IO会涉及到存储设备哪个地方的数据,然后会提前去读取。
deadline 内核总是想在执行更多的IO。比较适合要求实时性比较强的环境。
noop 非常普通算法, 按招进程产生的IO的时间进行排序,哪个IO先产生,内核就会去执行它。
如何更改?
临时更改:
# echo "deadline" > /sys/block/sda/queue/scheduler
# cat /sys/block/sda/queue/scheduler
noop anticipatory [deadline] cfq
永久修改:
# vim grub.conf
....
kernel /vmlinuz-2.6.18-274.el5 ro root=LABEL=/ rhgb quiet elevator=deadline
===========================================================
网络子系统
1、如何用工具检测当前网络的工作状态
2、调整:
增加带宽
调整应用程序
调整内核参数
增加网卡
# cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
eth0:12560602 181777 0 0 0 0 0 0 421085182 355989 0 0 0 0 0 0
# sar -n DEV
# iptraf -d eth0
# iptraf -i eth0
测试设备的最大可以使用的带宽
工具基于c/s
前提:测试的c和s都是处于同一类型的网络:例如两个不同机房的机器都是电信网络的。
netperf-2.5.0
服务端
# netserver
Starting netserver with host 'IN(6)ADDR_ANY' port '12865' and family AF_UNSPEC
服务端会打开12865端口
客户端:
# netperf -H 10.1.1.189 -l 30
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
87380 16384 16384 30.91 79.83 <---局域网应该接近90以上。
调整内核参数
常规调整:
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_synack_retries = 3
fs.file-max = 202508
查看内核参数的含义:
# yum install kernel-doc -y
# vim /usr/share/doc/kernel-doc-2.6.18/Documentation/XXX
搜索某个关键的文档
# grep -R "ip_forward" /usr/share/doc/kernel-doc-2.6.18/Documentation/
=======================================
多网卡绑定
物理图
/----eth0-----\
pc switch
\----eth1-----/
逻辑图
/-----eth0----\
pc bond0---switch
\-----eth1----/
文档
# vim /usr/share/doc/kernel-doc-2.6.18/Documentation/networking/bonding.txt
临时配置
# modprobe bonding miimon=100 mode=0
# ifconfig bond0 3.3.3.88 netmask 255.255.255.0 up
# ifenslave bond0 eth0 eth1
# ifconfig bond0
留意他的mac是取之于其中一个被绑定的物理网卡,然后另外一个物理网卡的MAC也被临时地更改为同一个
测试:
发送一个大文件
# watch 'ifconfig | grep "RX packets"'
永久配置
# vim /etc/modprobe.conf
alias bond0 bonding
options bonding miimon=100 mode=0
# vim /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=static
ONBOOT=yes
IPADDR=3.3.3.88
NETMASK=255.255.255.0
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
SLAVE=yes
MASTER=bond0
# vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
SLAVE=yes
MASTER=bond0
# ifup bond0
=======================================
搭建Lnmp,搭建一个论坛
location /status {
stub_status on;
access_log off;
}
Active connections: 1
server accepts handled requests
26 26 155 <----接受了26个请求,处理了26个请求
Reading: 0 Writing: 1 Waiting: 0
Reading: 正在接受(读取)客户端的访问请求
Writing: 正在处理客户端的访问请求(根据请求正在寻找访问的页面,处理访问的页面,或者正在把客户端需要的内容发送给客户端)
Waiting: 如果打开keepalive选项,保持了多少个活动连接。
一般查看writing,确定当前nginx的并发访问量。
# ab -c 1000 -n 20000 http://10.1.1.22/
大概4000左右的并发服务器就反应非常慢,基本不能访问
能够瞬间达到最高值8000,但访问不了
架构:
php-fpm ---> php-fpm.conf ---> php.ini 启动php-cgi进程
nginx -->nginx.conf ---> 启动nginx进程
验证进程分别使用不同cpu
# ps -eo pid,psr,pcpu,user,comm | grep nginx
4494 1 root nginx
4495 0 daemon nginx <--
4496 1 daemon nginx <--
# vim /usr/local/php//etc/php-fpm.conf
...
<value name="listen_address">127.0.0.1:9000</value>
<value name="max_children">24</value>
<value name="rlimit_files">65535</value>
<value name="max_requests">600</value> 每个php-cgi进程能够处理多少个并发请求
...
# php-fpm restart
实验使用的配置文件
user daemon;
error_log logs/error.log info;
pid logs/nginx.pid;
worker_processes 2;
worker_cpu_affinity 01 10;
worker_rlimit_nofile 204800;
events {
use epoll;
worker_connections 10240;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
#tcp_nopush on;
keepalive_timeout 8;
client_header_buffer_size 4k;
large_client_header_buffers 4 4k;
client_max_body_size 8m;
server_names_hash_bucket_size 128;
open_file_cache max=204800 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;
open_file_cache_errors off;
fastcgi_buffer_size 4k;
fastcgi_buffers 256 4k;
server {
listen 80 ;
server_name www.upl.com;
access_log /web/www/logs/upl.com.access.log main;
root /web/www/wwwroot;
index index.html index.htm index.php;
location ~* \.(gif|jpg|png|bmp|jpeg)$ {
expires 7d;
}
location ~* \.(js|css)$ {
expires 1d;
}
location /attachment {
limit_rate 100k;
}
location ~ \.php$ {
if ($uri ~ /phpmyadmin) {
root /web;
}
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}
location /status {
stub_status on;
access_log off;
}
}
}