简单的排除方法。
查看一下 Web 服务器上的中央处理单元(CPU)使用率,就可以了解 CPU 是否负载过重。
查看过去使用的总带宽并推断未来的变化,可以帮助判断什么时候需要进行网络升级。这些度量最好与其他度量和观测结合考虑。例如,当用户抱怨应用程序太慢时,可以检查磁盘操作是否达到了最大容量。
1. curl的应用。
[[email protected]]# curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} www.baidu.com 0.356:0.637:1.611
对 www.baidu.com执行curl命令,输出通常是html代码,通过 -o参数将html代码发送到/dev/null。-s去除掉所有的状态信息,-w参数是让curl列出计时器的状态信息:
0.356 建立到服务器的 TCP 连接所用的时间
0.637 在发出请求之后,Web 服务器返回数据的第一个字节所用的时间
1.611 完成请求所用的时间
web服务器处理请求并开始返回数据所用的时间 : 0.637 - 0.356= 0.281s.
客户端从服务器下载数据所用的时间是: 1.611 - 0.637 = 0.974s.
通过观察curl数据及其随时间变化的趋势,可以很好的了解网站对用户响应性.
2. uptime的应用。
[[email protected]]# uptime 15:17:03 up 85 days, 24 min, 1 user, load average: 0.26, 1.71, 1.63
load average后的3个数字,分别代表系统最近一分钟,五分钟,十五分钟的系统负载.
3. sar的应用。
[[email protected]]# sar -u 1 3 Linux 2.6.32-504.8.1.el6.x86_64 (host-172-28-5-131) 10/29/2015 _x86_64_ (4 CPU) 03:19:38 PM CPU %user %nice %system %iowait %steal %idle 03:19:39 PM all 1.25 0.00 0.75 0.25 0.00 97.76 03:19:40 PM all 1.01 0.00 0.25 15.08 0.00 83.67 03:19:41 PM all 1.00 0.00 0.50 1.00 0.25 97.26 Average: all 1.08 0.00 0.50 5.42 0.08 92.92
%user: 在用户模式中运行进程所花的时间比。
%nice : 运行正常进程所花的时间.
%system: 在内核模式(系统)中运行进程所花的时间。
%iowait:没有进程在该CPU上执行时,处理器等待I/O完成的时间
%idle:没有进程在该CPU上执行的时间
1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。
[[email protected]]# sar -d 10 3 Linux 2.6.32-504.8.1.el6.x86_64 (host-172-28-5-131) 10/29/2015 _x86_64_ (4 CPU) 03:22:02 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 03:22:12 PM dev252-0 9.64 57.66 119.39 18.36 0.06 6.42 2.93 2.82 03:22:12 PM dev252-16 8.43 0.00 75.53 8.96 0.06 7.24 0.46 0.39 03:22:12 PM dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:22:12 PM dev253-0 14.72 0.00 117.77 8.00 0.09 5.92 0.39 0.58 03:22:12 PM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:22:12 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 03:22:22 PM dev252-0 3.42 29.75 66.73 28.24 0.04 10.94 8.12 2.77 03:22:22 PM dev252-16 1.21 0.00 8.04 6.67 0.00 3.00 2.33 0.28 03:22:22 PM dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:22:22 PM dev253-0 4.12 0.00 32.96 8.00 0.01 1.95 1.07 0.44 03:22:22 PM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:22:22 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 03:22:32 PM dev252-0 2.93 13.74 43.64 19.59 0.02 5.34 4.52 1.32 03:22:32 PM dev252-16 2.12 87.27 14.55 48.00 0.01 3.90 2.38 0.51 03:22:32 PM dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:22:32 PM dev253-0 7.78 99.39 50.91 19.32 0.02 3.08 1.40 1.09 03:22:32 PM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util Average: dev252-0 5.32 33.67 76.50 20.71 0.04 7.20 4.34 2.31 Average: dev252-16 3.91 29.09 32.59 15.79 0.02 6.20 1.00 0.39 Average: dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: dev253-0 8.86 33.13 67.07 11.32 0.04 4.47 0.79 0.70 Average: dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
tps : 每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的
rd_sec/s : 每秒读扇区的次数.
wr_sec/s:每秒写扇区的次数.
avgrq-sz:平均每次设备I/O操作的数据大小(扇区).
avgqu-sz:磁盘请求队列的平均长度.
await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒).
svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.
%util:I/O请求占CPU的百分比,比率越大,说明越饱和
1. avgqu-sz 的值较低时,设备的利用率较高。
2. 当%util的值接近 1% 时,表示设备带宽已经占满
3) 要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来
1.怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看
2.怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看
3.怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看
4. top。
大多数 Linux 发布版都定义了适当的缓冲区和其他 Transmission Control Protocol(TCP)参数。可以修改这些参数来分配更多的内存,从而改进网络性能。设置内核参数的方法是通过 proc 接口,也就是通过读写 /proc 中的值。幸运的是,sysctl 可以读取/etc/sysctl.conf 中的值并根据需要填充 /proc,这样就能够更轻松地管理这些参数.
1).添加/etc/sysctl.conf中的参数
# Use TCP syncookies when needed
net.ipv4.tcp_syncookies = 1
# Enable TCP window scaling
net.ipv4.tcp_window_scaling: = 1
# Increase TCP max buffer size
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# Increase Linux autotuning TCP buffer limits
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# Increase number of ports available
net.ipv4.ip_local_port_range = 1024 65000
将这些设置添加到 /etc/sysctl.conf 的现有内容中。
第一个设置启用 TCP SYN cookie。当从客户机发来新的 TCP 连接时,数据包设置了 SYN 位,服务器就为这个半开的连接创建一个条目,并用一个 SYN-ACK 数据包进行响应。在正常操作中,远程客户机用一个 ACK 数据包进行响应,这会使半开的连接转换为全开的。有一种称为 SYN 泛滥的网络攻击,它使 ACK 数据包无法返回,导致服务器用光内存空间,无法处理到来的连接。SYN cookie 特性可以识别出这种情况,并使用一种优雅的方法保留队列中的空间。大多数系统都默认启用这个特性,但是确保配置这个特性更可靠。
第二个设置是启用tcp窗口伸缩使客户机能够以更高的速度下载数据。tcp允许在未从远程端收到确认的情况下发送多个数据包,默认设置最多使64k,在与延迟比较大的远程机进行通讯时这个设置是不够。窗口伸缩会在头中启用更多的位,从而增加窗口大小.
后面4个配置项是增加tcp发送和接收缓存区。这使得运用程序可以更快丢掉它的数据,从而为另一个请求服务.还可以强化远程客户机在服务器繁忙时发送数据的能力。
最后一个配置是增加可用的本地端口数量,这样就增加了可以同时服务的最大连接数量. 运行 sysctl -p /etc/sysctl.conf ,这样设置就会生效.
2)磁盘调优
磁盘在 LAMP 架构中扮演着重要的角色。静态文件、模板和代码都来自磁盘,组成数据库的数据表和索引也来自磁盘。对磁盘的许多调优(尤其是对于数据库)集中于避免磁盘访问,因为磁盘访问的延迟相当高.
首先要在文件系统上禁用atime日志记录特性.atime是最近访问文件的时间,每当访问文件时,底层文件系统必须记录这个时间戳。因为我们很少使用atime,禁用它可以减少磁盘的访问时间. 禁用该特性的方法是,在/etc/fstab的第四列中添加noatime。
如何启用 noatime 的 fstab 示例
/dev/mapper/VolGroup-lv_root / ext4 defaults,noatime 1 1
UUID=ba007d22-b42b-4b1e-9301-eec5535dffe1 /boot ext4 defaults,noatime 1 2
/dev/mapper/VolGroup-LogVol02 /opt ext4 defaults,noatime 1 2
/dev/mapper/VolGroup-lv_swap swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
上述修改了 ext4 文件系统,因为 noatime 只对驻留在磁盘上的文件系统有帮助。为让这一修改生效,不需要重新引导;只需重新挂装每个文件系统, 运行 mount / -o remount。
可以使用 hdparm 命令查明和设置用来访问 IDE 磁盘的方法。hdparm -t /path/to/device 执行速度测试,可以将这个测试结果作为性能基准。为了使结果尽可能准确,在运行这个命令时系统应该是空闲的.
在/dev/sda 上执行的速度测试
# hdparm -t /dev/sda
/dev/sda:
Timing buffered disk reads: 290 MB in 3.18 seconds = 91.27 MB/sec
这一测试说明,在这个磁盘上读取数据的速度是大约每秒 91.27 MB。
3) I/O调优
在/etc/grub.conf中加入相应的I/O调度算法.
I/O调度算法总共有4种.
1.deadline算法 (适合小文件读写,跳跃式读写,零散读写,适合吞吐量非常大的运用)(数据库)
2. anticipatory算法 (适合大文件读写,整块式,重复读写) (web server)
3. cfg算法 (完全公平算法)
4. noop算法 (没有算法)
将I/o调度算法改为deadline算法.
echo deadline > /sys/block/sda/queue/scheduler
4)将访问数超过150的ip加上防火墙
#!/bin/sh status=`netstat -na|awk ‘5 ~ /[0-9]+:[0-9]+/ {print5}‘ |awk -F ":" -- ‘{print $1}‘ |sort -n|uniq -c |sort -n|tail -n 1` NUM=`echo status|awk ‘{print1}‘` IP=`echo status|awk ‘{print2}‘` result=`echo "$NUM > 150" | bc` if [ $result = 1 ];then echo IP:IPisoverNUM, BAN IT! /sbin/iptables -I INPUT -s $IP -j DROP fi
将该shell脚本加入crontab中,5秒运行一次.
5)查看apache的并发请求数及其tcp连接状态:
[[email protected] ~]netstat -nat|awk ‘{print $NF}‘|sort|uniq -c|sort -n 1 established) 1 State 3 LAST_ACK 4 FIN_WAIT2 11 SYN_SENT 14 LISTEN 19 CLOSE_WAIT 43 FIN_WAIT1 244 SYN_RECV 696 TIME_WAIT 1126 ESTABLISHED
上述参数的描述
SYN_RECV : 表示正在等待处理的请求数.
ESTABLISHED : 表示正常数据传输状态
TIME_WAIT : 表示处理完毕,等待超时结束的请求数。