linux多网卡的7种bond模式原理

多网卡的7种bond模式原理

Linux网卡绑定mode共有七种(0~6) bond0、bond1、bond2、bond3、bond4、bond5、bond6

常用的有三种
mode=0:平衡负载模式,有自动备援,但需要”Switch”支援及设定。
mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援。
mode=6:平衡负载模式,有自动备援,不必”Switch”支援及设定。
需要说明的是如果想做成mode 0的负载均衡,仅仅设置这里options bond0 miimon=100 mode=0是不够的,与网卡相连的交换机必须做特殊配置(这两个端口应该采取聚合方式),因为做bonding的这两块网卡是使用同一个MAC地址.从原理分析一下(bond运行在mode 0下):
mode 0下bond所绑定的网卡的IP都被修改成相同的mac地址,如果这些网卡都被接在同一个交换机,那么交换机的arp表里这个mac地址对应的端口就有多 个,那么交换机接受到发往这个mac地址的包应该往哪个端口转发呢?正常情况下mac地址是全球唯一的,一个mac地址对应多个端口肯定使交换机迷惑了。所以 mode0下的bond如果连接到交换机,交换机这几个端口应该采取聚合方式(cisco称为 ethernetchannel,foundry称为portgroup),因为交换机做了聚合后,聚合下的几个端口也被捆绑成一个mac地址.我们的解 决办法是,两个网卡接入不同的交换机即可。
mode6模式下无需配置交换机,因为做bonding的这两块网卡是使用不同的MAC地址。

七种bond模式说明
第一种模式:mod=0 ,即:(balance-rr) Round-robin policy(平衡抡循环策略)
特点:传输数据包顺序是依次传输(即:第1个包走eth0,下一个包就走eth1….一直循环下去,直到最后一个传输完毕),此模式提供负载平衡和容错能力;但是我们知道如果一个连接或者会话的数据包从不同的接口发出的话,中途再经过不同的链路,在客户端很有可能会出现数据包无序到达的问题,而无序到达的数据包需要重新要求被发送,这样网络的吞吐量就会下降

第二种模式:mod=1,即: (active-backup) Active-backup policy(主-备份策略)
特点:只有一个设备处于活动状态,当一个宕掉另一个马上由备份转换为主设备。mac地址是外部可见得,从外面看来,bond的MAC地址是唯一的,以避免switch(交换机)发生混乱。此模式只提供了容错能力;由此可见此算法的优点是可以提供高网络连接的可用性,但是它的资源利用率较低,只有一个接口处于工作状态,在有 N 个网络接口的情况下,资源利用率为1/N

第三种模式:mod=2,即:(balance-xor) XOR policy(平衡策略)
特点:基于指定的传输HASH策略传输数据包。缺省的策略是:(源MAC地址 XOR 目标MAC地址) % slave数量。其他的传输策略可以通过xmit_hash_policy选项指定,此模式提供负载平衡和容错能力

第四种模式:mod=3,即:broadcast(广播策略)
特点:在每个slave接口上传输每个数据包,此模式提供了容错能力

第五种模式:mod=4,即:(802.3ad) IEEE 802.3ad Dynamic link aggregation(IEEE 802.3ad 动态链接聚合)
特点:创建一个聚合组,它们共享同样的速率和双工设定。根据802.3ad规范将多个slave工作在同一个激活的聚合体下。
外出流量的slave选举是基于传输hash策略,该策略可以通过xmit_hash_policy选项从缺省的XOR策略改变到其他策略。需要注意的 是,并不是所有的传输策略都是802.3ad适应的,尤其考虑到在802.3ad标准43.2.4章节提及的包乱序问题。不同的实现可能会有不同的适应 性。
必要条件:
条件1:ethtool支持获取每个slave的速率和双工设定
条件2:switch(交换机)支持IEEE 802.3ad Dynamic link aggregation
条件3:大多数switch(交换机)需要经过特定配置才能支持802.3ad模式

第六种模式:mod=5,即:(balance-tlb) Adaptive transmit load balancing(适配器传输负载均衡)
特点:不需要任何特别的switch(交换机)支持的通道bonding。在每个slave上根据当前的负载(根据速度计算)分配外出流量。如果正在接受数据的slave出故障了,另一个slave接管失败的slave的MAC地址。
该模式的必要条件:ethtool支持获取每个slave的速率

第七种模式:mod=6,即:(balance-alb) Adaptive load balancing(适配器适应性负载均衡)
特点:该模式包含了balance-tlb模式,同时加上针对IPV4流量的接收负载均衡(receive load balance, rlb),而且不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的。bonding驱动截获本机发送的ARP应答,并把源硬件地址改写为bond中某个slave的唯一硬件地址,从而使得不同的对端使用不同的硬件地址进行通信。
来自服务器端的接收流量也会被均衡。当本机发送ARP请求时,bonding驱动把对端的IP信息从ARP包中复制并保存下来。当ARP应答从对端到达 时,bonding驱动把它的硬件地址提取出来,并发起一个ARP应答给bond中的某个slave。使用ARP协商进行负载均衡的一个问题是:每次广播 ARP请求时都会使用bond的硬件地址,因此对端学习到这个硬件地址后,接收流量将会全部流向当前的slave。这个问题可以通过给所有的对端发送更新 (ARP应答)来解决,应答中包含他们独一无二的硬件地址,从而导致流量重新分布。当新的slave加入到bond中时,或者某个未激活的slave重新 激活时,接收流量也要重新分布。接收的负载被顺序地分布(round robin)在bond中最高速的slave上
当某个链路被重新接上,或者一个新的slave加入到bond中,接收流量在所有当前激活的slave中全部重新分配,通过使用指定的MAC地址给每个 client发起ARP应答。下面介绍的updelay参数必须被设置为某个大于等于switch(交换机)转发延时的值,从而保证发往对端的ARP应答 不会被switch(交换机)阻截。
必要条件:
条件1:ethtool支持获取每个slave的速率;
条件2:底层驱动支持设置某个设备的硬件地址,从而使得总是有个slave(curr_active_slave)使用bond的硬件地址,同时保证每个bond 中的slave都有一个唯一的硬件地址。如果curr_active_slave出故障,它的硬件地址将会被新选出来的 curr_active_slave接管
其实mod=6与mod=0的区别:mod=6,先把eth0流量占满,再占eth1,….ethX;而mod=0的话,会发现2个口的流量都很稳定,基本一样的带宽。而mod=6,会发现第一个口流量很高,第2个口只占了小部分流量
Linux网口绑定
通过网口绑定(bond)技术,可以很容易实现网口冗余,负载均衡,从而达到高可用高可靠的目的。前提约定:
2个物理网口分别是:eth0,eth1
绑定后的虚拟口是:bond0
服务器IP是:192.168.0.100

第一步,配置设定文件:
/etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.0.100
NETMASK=255.255.255.0
NETWORK=192.168.0.0
BROADCAST=192.168.0.255
#BROADCAST广播地址
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
MASTER=bond0
SLAVE=yes

第二步,修改modprobe相关设定文件,并加载bonding模块:
1.在这里,我们直接创建一个加载bonding的专属设定文件/etc/modprobe.d/bonding.conf
[root@test ~]# vi /etc/modprobe.d/bonding.conf
#追加
alias bond0 bonding
options bonding mode=0 miimon=200
2.加载模块(重启系统后就不用手动再加载了)
[root@test ~]# modprobe bonding
3.确认模块是否加载成功:
[root@test ~]# lsmod | grep bonding
bonding 100065 0

第三步,重启一下网络,然后确认一下状况:
[root@test ~]# /etc/init.d/network restart
[root@test ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.5.0 (November 4, 2008)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
……
 [root@test ~]# ifconfig | grep HWaddr
bond0 Link encap:Ethernet HWaddr 00:16:36:1B:BB:74
eth0 Link encap:Ethernet HWaddr 00:16:36:1B:BB:74
eth1 Link encap:Ethernet HWaddr 00:16:36:1B:BB:74
从上面的确认信息中,我们可以看到3个重要信息:
1.现在的bonding模式是active-backup
2.现在Active状态的网口是eth0
3.bond0,eth1的物理地址和处于active状态下的eth0的物理地址相同,这样是为了避免上位交换机发生混乱。
任意拔掉一根网线,然后再访问你的服务器,看网络是否还是通的。

第四步,系统启动自动绑定、增加默认网关:
[root@test ~]# vi /etc/rc.d/rc.local
#追加
ifenslave bond0 eth0 eth1
route add default gw 192.168.0.1
#如可上网就不用增加路由,0.1地址按环境修改.
------------------------------------------------------------------------
留心:前面只是2个网口绑定成一个bond0的情况,如果我们要设置多个bond口,比如物理网口eth0和eth1组成bond0,eth2和eth3组成bond1,
那么网口设置文件的设置方法和上面第1步讲的方法相同,只是/etc/modprobe.d/bonding.conf的设定就不能像下面这样简单的叠加了:
alias bond0 bonding
options bonding mode=1 miimon=200
alias bond1 bonding
options bonding mode=1 miimon=200

正确的设置方法有2种:
第一种,你可以看到,这种方式的话,多个bond口的模式就只能设成相同的了:
alias bond0 bonding
alias bond1 bonding
options bonding max_bonds=2 miimon=200 mode=1

第二种,这种方式,不同的bond口的mode可以设成不一样:
alias bond0 bonding
options bond0 miimon=100 mode=1
install bond1 /sbin/modprobe bonding -o bond1 miimon=200 mode=0
仔细看看上面这2种设置方法,现在如果是要设置3个,4个,甚至更多的bond口,你应该也会了吧!
后记:简单的介绍一下上面在加载bonding模块的时候,options里的一些参数的含义:
miimon 监视网络链接的频度,单位是毫秒,我们设置的是200毫秒。
max_bonds 配置的bond口个数
mode bond模式,主要有以下几种,在一般的实际应用中,0和1用的比较多,
如果你要深入了解这些模式各自的特点就需要靠读者你自己去查资料并做实践了。

多网卡绑定图解
1 、用 root 用户登录
2 、用ifconfig 命令看一下 ip 地址,看一下 eth0 和 eth1 是否获取到 IP 地址(因为linux 这台服务器是连接在一台 DHCP 的服务器)
查看到 IP 地址为 eth0 16.157.125.78 eth1 16.157.125.113
broadcast : 16.157.125.255 mask : 255.255.254.0 ( eth0 和 eth1 都是这个 broadcast 和 mask )
3 、编辑虚拟网络接口配置文件 , 指定网卡 IP
vi /etc/sysconfig/ network-scripts/ ifcfg-bond0 创建一个虚拟网络接口配置文件
  
  4 、 [root@rhas-13 root]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 ifcfg-bond0 把 ifcfg-eth0 里面的配置文件复制到 ifcfg-bond0 里面去
  然后用 vi ifcfg-bond0 命令修改虚拟配置端口。
  
  5 、修改第一行 DEVICE=bond0 ,然后把配置改成 eth0 的配置(配置完成为下边的图)
  按此在新窗口浏览图片
  6 、用 cat 命令查看一下 eth0 和 eth1 的配置
  按此在新窗口浏览图片
  7 、 # vi /etc/modules.conf
  编辑 /etc/modules.conf 文件,加入如下一行内容,以使系统在启动时加载 bonding 模块
  按此在新窗口浏览图片
  8 、加入下列两行
  alias bond0 bonding
  options bond0 miimon=100 mode=1
  说明: miimon 是用来进行链路监测的。比如 :miimon=100 ,那么系统每 100ms 监测一次链路连接状态,如果有一条线路不通就转入另一条线路; mode 的值表示工作模式,他共有 0 , 1,2,3 四种模式,常用的为 0,1 两种。
  mode=0 表示 load balancing (round-robin) 为负载均衡方式,两块网卡都工作。
  mode=1 表示 fault-tolerance (active-backup) 提供冗余功能,工作方式是主备的工作方式 , 也就是说默认情况下只有一块网卡工作 , 另一块做备份 .
  bonding 只能提供链路监测,即从主机到交换机的链路是否接通。如果只是交换机对外的链路 down 掉了,而交换机本身并没有故障,那么 bonding 会认为链路没有问题而继续使用。
  按此在新窗口浏览图片
  9 、 # vi /etc/rc.d/rc.local
  按此在新窗口浏览图片
  10 、加入两行
  ifenslave bond0 eth0 eth1
  route add -net 16.157.125.255 netmask 255.255.255.0 bond0
  添加后为下图:
  按此在新窗口浏览图片
  11 、 reboot 开机自检时候看红色框里面就成功了 .
  按此在新窗口浏览图片
  12 、可以进入系统里面查看一下 ip 就可以了.
  按此在新窗口浏览图片
  上图可以看出来 bond0 已经获取到 eth0 初始化的地址,而且 eth0 和 eth1 的 mac 地址都是一样的,说明两块已经绑定成一块网卡.

shell显示操作用户以及路径

 

修改/.profile文件,这样做可以在操作的时候显示操作用户以及路径。方法如下:

针对所有用户设置可以 /etc/profile中设置

针对单个用户设置可以/home/.profile中设置。

以root用户为例:

vi /.profile

PS1='[\u@\h:$PWD]#’

export PS1

保存退出文件wq

Nginx URL重写(rewrite)

Nginx URL重写(rewrite)介绍

和apache等web服务软件一样,rewrite的组要功能是实现RUL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持

rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。

rewrite语法格式及参数语法说明如下:

    rewrite    <regex>    <replacement>    [flag];

关键字      正则        替代内容          flag标记

 

关键字:其中关键字error_log不能改变

正则:perl兼容正则表达式语句进行规则匹配

替代内容:将正则匹配的内容替换成replacement

flag标记:rewrite支持的flag标记

 

flag标记说明:

last  #本条规则匹配完成后,继续向下匹配新的location URI规则

break  #本条规则匹配完成即终止,不再匹配后面的任何规则

redirect  #返回302临时重定向,浏览器地址会显示跳转后的URL地址

permanent  #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

rewrite参数的标签段位置:

server,location,if

例子:

rewrite ^/(.*) http://www.czlun.com/$1 permanent;

说明:

rewrite为固定关键字,表示开始进行rewrite匹配规则

regex部分是 ^/(.*) ,这是一个正则表达式,匹配完整的域名和后面的路径地址

replacement部分是http://www.czlun.com/$1 $1,是取自regex部分()里的内容。匹配成功后跳转到的URL。

flag部分 permanent表示永久301重定向标记,即跳转到新的 http://www.czlun.com/$1 地址上

regex 常用正则表达式说明

字符 描述
\ 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ 匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“oll”,但不能匹配“o”
? 匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
. 匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式。
(pattern) 匹配括号内pattern并可以在后面获取对应的匹配,常用$0…$9属性获取小括号中的匹配内容,要匹配圆括号字符需要\(Content\)

rewrite 企业应用场景

Nginx的rewrite功能在企业里应用非常广泛:

u 可以调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。

u 为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。

u 网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的360buy.com会跳转到jd.com

u 根据特殊变量、目录、客户端的信息进行URL调整等

Nginx配置rewrite过程介绍

(1)创建rewrite语句

vi conf/vhost/www.abc.com.conf

#vi编辑虚拟主机配置文件

文件内容

server {

listen 80;

server_name abc.com;

rewrite ^/(.*) http://www.abc.com/$1 permanent;

}

 

 

server {

listen 80;

server_name www.abc.com;

location / {

root /data/www/www;

index index.html index.htm;

}

error_log    logs/error_www.abc.com.log error;

access_log    logs/access_www.abc.com.log    main;

}

或者

server {

listen 80;

server_name abc.com www.abc.com;

if ( $host != ‘www.abc.com’  ) {

rewrite ^/(.*) http://www.abc.com/$1 permanent;

}

location / {

root /data/www/www;

index index.html index.htm;

}

error_log    logs/error_www.abc.com.log error;

access_log    logs/access_www.abc.com.log    main;

}

(2)重启服务

确认无误便可重启,操作如下:

nginx -t

#结果显示ok和success没问题便可重启

nginx -s reload

(3)查看跳转效果

打开浏览器访问abc.com

页面打开后,URL地址栏的abc.com变成了www.abc.com说明URL重写成功。

tomcat优化

当一个进程有 500 个线程在跑的话,那性能已经是很低很低了。Tomcat 默认配置的最大请求数是 150,也就是说同时支持 150 个并发,当然了,也可以将其改大。

当某个应用拥有 250 个以上并发的时候,应考虑应用服务器的集群。
具体能承载多少并发,需要看硬件的配置,CPU 越多性能越高,分配给 JVM 的内存越多性能也就越高,但也会加重 GC 的负担。
操作系统对于进程中的线程数有一定的限制:
Windows 每个进程中的线程数不允许超过 2000
Linux 每个进程中的线程数不允许超过 1000
另外,在 Java 中每开启一个线程需要耗用 1MB 的 JVM 内存空间用于作为线程栈之用。
Tomcat的最大并发数是可以配置的,实际运用中,最大并发数与硬件性能和CPU数量都有很大关系的。更好的硬件,更多的处理器都会使Tomcat支持更多的并发。
Tomcat 默认的 HTTP 实现是采用阻塞式的 Socket 通信,每个请求都需要创建一个线程处理。这种模式下的并发量受到线程数的限制,但对于 Tomcat 来说几乎没有 BUG 存在了。
Tomcat 还可以配置 NIO 方式的 Socket 通信,在性能上高于阻塞式的,每个请求也不需要创建一个线程进行处理,并发能力比前者高。但没有阻塞式的成熟。
这个并发能力还与应用的逻辑密切相关,如果逻辑很复杂需要大量的计算,那并发能力势必会下降。如果每个请求都含有很多的数据库操作,那么对于数据库的性能也是非常高的。
对于单台数据库服务器来说,允许客户端的连接数量是有限制的。
并发能力问题涉及整个系统架构和业务逻辑。
系统环境不同,Tomcat版本不同、JDK版本不同、以及修改的设定参数不同。并发量的差异还是满大的。

maxThreads=”1000″ 最大并发数
minSpareThreads=”100″///初始化时创建的线程数
maxSpareThreads=”500″///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
acceptCount=”700″// 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理

配置实例:
<Connector port=”8080″ protocol=”HTTP/1.1″ minSpareThreads=”100″ maxSpareThreads=”500″ maxThreads=”1000″ acceptCount=”700″
connectionTimeout=”20000″
redirectPort=”8443″ />

 

 

以下是一个配置实例:

 

<Executor name=”tomcatThreadPool” # 配置TOMCAT共享线程池,NAME为名称
namePrefix=”HTTP-8088-exec-” # 线程的名字前缀,用于标记线程名称
prestartminSpareThreads=”true” # executor启动时,是否开启最小的线程数
maxThreads=”5000″ # 允许的最大线程池里的线程数量,默认是200,大的并发应该设置的高一些,这里设置可以支持到5000并发
maxQueueSize=”100″ # 任务队列上限
minSpareThreads=”50″ # 最小的保持活跃的线程数量,默认是25.这个要根据负载情况自行调整了。太小了就影响反应速度,太大了白白占用资源
maxIdleTime=”10000″ # 超过最小活跃线程数量的线程,如果空闲时间超过这个设置后,会被关别。默认是1分钟。
/>
[html] view plain copy
<Connector port=”8088″ protocol=”org.apache.coyote.http11.Http11NioProtocol”
connectionTimeout=”5000″ redirectPort=”443″ proxyPort=”443″ executor=”tomcatThreadPool” # 采用上面的共享线程池
URIEncoding=”UTF-8″/>

15个有用的MySQL/MariaDB性能调整和优化技巧

MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS)。它发布于 1995 年(20年前)。它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择。最新的 MySQL 版本是 5.6.25,于 2015 年 5 月 29 日发布。

关于 MySQL 一个有趣的事实是它的名字来自于 Michael Widenius(MySQL 的创始人)的女儿“ My”。尽管有许多关于 MySQL 有趣的传闻,不过本文主要是向你展示一些有用的实践,以帮助你管理你的 MySQL 服务器。

2009 年 4 月,MySQL 被 Oracle 收购。其结果是MySQL 社区分裂,创建了一个叫 MariaDB 的分支 。创建该分支的主要原因是为了保持这个项目可以在 GPL 下的自由。

今天,MySQL 和 MariaDB 是用于类似 WordPress、Joomla、Magento 和其他web 应用程序的最流行的 RDMS 之一(如果不是最多的)。

这篇文章将告诉你一些基本的,但非常有用的关于如何优化 MySQL/MariaDB 性能的技巧。注意,本文假定您已经安装了 MySQL 或 MariaDB。如果你仍然不知道如何在系统上安装它们,你可以按照以下说明去安装:

在 RHEL/CentOS 7 上安装 LAMP

在 Fedora 22 上安装 LAMP

在 Ubuntu 15.04 安装 LAMP

在 Debian 8 上安装 MariaDB

在 Gentoo Linux 上安装 MariaDB

在 Arch Linux 上安装 MariaDB

重要提示: 在开始之前,不要盲目的接受这些建议。每个MySQL 设置都是不同的,在进行任何更改之前需要慎重考虑。

你需要明白这些:

MySQL/MariaDB 配置文件位于 /etc/my.cnf。 每次更改此文件后你需要重启 MySQL 服务,以使更改生效。

这篇文章使用 MySQL 5.6 版本。

1. 启用 InnoDB 的每张表一个数据文件设置

首先,有一个重要的解释, InnoDB 是一个存储引擎。MySQL 和 MariaDB 使用InnoDB 作为默认存储引擎。以前,MySQL 使用系统表空间来保存数据库中的表和索引。这意味着服务器唯一的目的就是数据库处理,它们的存储盘不用于其它目的。

InnoDB 提供了更灵活的方式,它把每个数据库的信息保存在一个 .ibd 数据文件中。每个 .idb 文件代表它自己的表空间。通过这样的方式可以更快地完成类似 “TRUNCATE” 的数据库操作,当删除或截断一个数据库表时,你也可以回收未使用的空间。

这样配置的另一个好处是你可以将某些数据库表放在一个单独的存储设备。这可以大大提升你磁盘的 I/O 负载。

MySQL 5.6及以上的版本默认启用 innodb_file_per_table。你可以在 /etc/my.cnf 文件中看到。该指令看起来是这样的:

innodb_file_per_table=1

2. 将 MySQL 数据库数据存储到独立分区上

注意:此设置只在 MySQL 上有效, 在 MariaDB 上无效。

有时候操作系统的读/写会降低你 MySQL 服务器的性能,尤其是如果操作系统和数据库的数据位于同一块磁盘上。因此,我建议你使用单独的磁盘(最好是 SSD)用于 MySQL 服务。

要完成这步,你需要将新的磁盘连接到你的计算机/服务器上。对于这篇文章,我假定磁盘挂在到 /dev/sdb。

下一步是准备新的分区:

#fdisk /dev/sdb

现在按 “N” 来创建新的分区。接着按 “P”,使其创建为主分区。在此之后,从 1-4 设置分区号。之后,你可以选择分区大小。这里按 enter。在下一步,你需要配置分区的大小。

如果你希望使用全部的磁盘,再按一次 enter。否则,你可以手动设置新分区的大小。准备就绪后按“w” 保存更改。现在,我们需要为我们的新分区创建一个文件系统。这可以用下面命令轻松地完成:

#mkfs.ext4 /dev/sdb1

现在我们会挂载新分区到一个目录。我在根目录下创建了一个名为 “ssd” 的目录:

#mkdir /ssd/

挂载新分区到刚才创建的目录下:

#mount /dev/sdb1  /ssd/

你可以在 /etc/fstab 文件中添加如下行设置为开机自动挂载:

/dev/sdb1 /ssd ext3 defaults 00

现在我们将MySQL 移动到新磁盘中

首先停止 MySQL 服务:

# service mysqld stop

我建议你​​同时停止 Apache/nginx,以防止任何试图写入数据库的操作:

# service httpd stop

# service nginx stop

现在复制整个 MySQL 目录到新分区中:

#cp /var/lib/mysql /ssd/ -Rp

这可能需要一段时间,具体取决于你的 MySQL 数据库的大小。一旦这个过程完成后重命名 MySQL 目录:

#mv /var/lib/mysql /var/lib/mysql-backup

然后创建一个符号链接:

#ln -s /ssd/mysql /var/lib/mysql

现在启动你的 MySQL 和 web 服务:

# service mysqld start

# service httpd start

# service nginx start

以后你的数据库将使用新的磁盘访问。

3. 优化使用 InnoDB 的缓冲池

InnoDB 引擎在内存中有一个缓冲池用于缓存数据和索引。这当然有助于你更快地执行MySQL/MariaDB 查询语句。选择合适的内存大小需要一些重要的决策并对系统的内存消耗有较多的认识。

下面是你需要考虑的:

其它的进程需要消耗多少内存。这包括你的系统进程,页表,套接字缓冲。

你的服务器是否专门用于 MySQL 还是你运行着其它非常消耗内存的服务。

在一个专用的机器上,你可能会把 60-70%的内存分配给 innodb_buffer_pool_size。如果你打算在一个机器上运行更多的服务,你应该重新考虑专门用于 innodb_buffer_pool_size 的内存大小。

你需要设置 my.cnf 中的此项:

innodb_buffer_pool_size

4. 在 MySQL 中避免使用 Swappiness

“交换”是一个当系统移动部分内存到一个称为“交换空间” 的特殊磁盘空间时的过程。通常当你的系统用完物理内存后就会出现这种情况,系统将信息写入磁盘而不是释放一些内存。正如你猜测的磁盘比你的内存要慢得多。

该选项默认情况下是启用的:

#sysctl vm.swappiness

 

vm.swappiness= 60

运行以下命令关闭 swappiness:

#sysctl -w vm.swappiness=0

5. 设置 MySQL 的最大连接数

max_connections 指令告诉你当前你的服务器允许多少并发连接。MySQL/MariaDB 服务器允许有 SUPER 权限的用户在最大连接之外再建立一个连接。只有当执行 MySQL 请求的时候才会建立连接,执行完成后会关闭连接并被新的连接取代。

请记住,太多的连接会导致内存的使用量过高并且会锁住你的 MySQL 服务器。一般小网站需要 100-200 的连接数,而较大可能需要 500-800 甚至更多。这里的值很大程度上取决于你 MySQL/MariaDB 的使用情况。

你可以动态地改变 max_connections 的值而无需重启MySQL服务器:

# mysql -u root -p

mysql>setglobal max_connections = 300;

6. 配置 MySQL 的线程缓存数量

thread_cache_size 指令用来设置你服务器缓存的线程数量。当客户端断开连接时,如果当前线程数小于thread_cache_size,它的线程将被放入缓存中。下一个请求通过使用缓存池中的线程来完成。

要提高服务器的性能,你可以设置 thread_cache_size 的值相对高一些。你可以通过以下方法来查看线程缓存命中率:

mysql>show status like ‘Threads_created’;

mysql>show status like ‘Connections’;

你可以用以下公式来计算线程池的命中率:

100 – ((Threads_created / Connections) * 100)

如果你得到一个较低的数字,这意味着大多数mysql 连接使用新的线程,而不是从缓存加载。在这种情况下,你需要增加thread_cache_size

这里有一个好处是可以动态地改变 thread_cache_size 而无需重启 MySQL 服务。你可以通过以下方式来实现:

mysql>setglobal thread_cache_size = 16;

7. 禁用 MySQL 的 DNS 反向查询

默认情况下当新的连接出现时,MySQL/MariaDB会进行 DNS 查询解析用户的 IP 地址/主机名。对于每个客户端连接,它的 IP 都会被解析为主机名。然后,主机名又被反解析为 IP 来验证两者是否一致。

当 DNS 配置错误或服务器出现问题时,这很可能会导致延迟。这就是为什么要关闭 DNS 的反向查询的原因,你可以在你的配置文件中添加以下选项去设定:

[mysqld]

#Skip reverse DNS lookup of clients

skip-name-resolve

更改后你需要重启 MySQL 服务。

8. 配置 MySQL 的查询缓存容量

如果你有很多重复的查询并且数据不经常改变 – 请使用缓存查询。人们常常不理解 query_cache_size 的实际含义而将此值设置为 GB 级,这实际上会降低服务器的性能。

背后的原因是,在更新过程中线程需要锁定缓存。通常设置为 200-300 MB应该足够了。如果你的网站比较小的,你可以尝试给 64M 并在以后及时去增加。

在你的 MySQL 配置文件中添加以下设置:

query_cache_type= 1

query_cache_limit= 256K

query_cache_min_res_unit= 2k

query_cache_size= 80M

9. 配置临时表容量和内存表最大容量

tmp_table_size 和 max_heap_table_size 这两个变量的大小应该相同,它们可以让你避免磁盘写入。tmp_table_size 是内置内存表的最大空间。如果表的大小超出限值将会被转换为磁盘上的 MyISAM 表。

这会影响数据库的性能。管理员通常建议在服务器上设置这两个值为每 GB 内存给 64M。

[mysqld]

tmp_table_size=64M

max_heap_table_size=64M

10. 启用 MySQL 慢查询日志

记录慢查询可以帮助你定位数据库中的问题并帮助你调试。这可以通过在你的 MySQL 配置文件中添加以下值来启用:

slow-query-log= 1

slow-query-log-file = /var/lib/mysql/mysql-slow.log

long_query_time= 1

第一个变量启用慢查询日志,第二个告诉 MySQL 实际的日志文件存储位置。使用 long_query_time 来定义完成 MySQL 查询多少用时算长。

11. 检查 MySQL 的空闲连接

空闲连接会消耗资源,可以的话应该被终止或者刷新。空闲连接是指处于 “sleep” 状态并且保持了很长一段时间的连接。你可以通过运行以下命令查看空闲连接:

# mysqladmin processlist -u root -p | grep “Sleep”

这会显示处于睡眠状态的进程列表。当代码使用持久连接到数据库时会出现这种情况。使用 PHP 调用 mysql_pconnect 可以打开这个连接,执行完查询之后,删除认证信息并保持连接为打开状态。这会导致每个线程的缓冲都被保存在内存中,直到该线程结束。

首先你要做的就是检查代码问题并修复它。如果你不能访问正在运行的代码,你可以修改 wait_timeout 变量。默认值是 28800 秒,而你可以安全地将其降低到 60 :

wait_timeout=60

12. 为 MySQL 选择正确的文件系统

选择正确的文件系统对数据库至关重要。在这里你需要考虑的最重要的事情是 – 数据的完整性,性能和易管理性。

按照 MariaDB 的建议,最好的文件系统是XFS、ext4 和 Btrfs。它们都是可以使用超大文件和大容量存储卷的企业级日志型文件系统。

下面你可以找到一些关于这三个文件系统的有用信息:

文件系统 XFS Ext4 Btrfs
文件系统最大容量 8EB 1EB 16EB
最大文件大小 8EB 16TB 16EB

我们的这篇文章详细介绍了 Linux 文件系统的利与弊: Linux 文件系统解析

13. 设置 MySQL 允许的最大数据包

MySQL 把数据拆分成包。通常一个包就是发送到客户端的一行数据。max_allowed_pa​​cket 变量定义了可以被发送的最大的包。

此值设置得过低可能会导致查询速度变得非常慢,然后你会在 MySQL 的错误日志看到一个错误。建议将该值设置为最大包的大小。

14. 测试 MySQL 的性能优化

你应该定期检查 MySQL/MariaDB 的性能。这将帮助你了解资源的使用情况是否发生了改变或需要进行改进。

有大量的测试工具可用,但我推荐你一个简单易用的。该工具被称为 mysqltuner。

使用下面的命令下载并运行它:

#wget https://github.com/major/MySQLTuner-perl/tarball/master

#tar xf master

#cd major-MySQLTuner-perl-993bc18/

# ./mysqltuner.pl

你将收到有关 MySQL 使用的详细报告和推荐提示。下面是默认 MariaDB 安装的输出样例:

15. 优化和修复 MySQL 数据库

有时候 MySQL/MariaDB 数据库中的表很容易崩溃,尤其是服务器意外关机、文件系统突然崩溃或复制过程中仍然访问数据库。幸运的是,有一个称为 ‘mysqlcheck’ 的免费开源工具,它会自动检查、修复和优化 Linux 中数据库的所有表。

# mysqlcheck -u root -p –auto-repair –check –optimize–all-databases

# mysqlcheck -u root -p –auto-repair –check –optimizedatabasename

就是这些!我希望上述文章对你有用,并帮助你优化你的MySQL 服务器。一如往常,如果你有任何疑问或评论,请在下面的评论部分提交。

超简单将Centos的yum源更换为国内的阿里云源

1、备份

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/

CentOS 5

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo

CentOS 6

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

CentOS 7

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

3、之后运行yum makecache生成缓存

Centos 7配置Bonding

环境介绍:

系统:目前最新的7.2

[root@localhostnetwork-scripts]# lsb_release -a

LSBVersion:        :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch

DistributorID:        CentOS

Description:        CentOSLinux release 7.2.1511 (Core)

Release:        7.2.1511

Codename:        Core

网络:

VMware虚拟机,添加5块网卡都配置NAT,有一块负责跟主机ssh。
1、环境准备

centos 7是最小化安装,启动后看一下网卡IP,可以通过 ssh 连接了,先安装几个网络管理工具,像 ifconfig默认都没有安装。

yum -y install vimwget pciutils net-tools
2、查看网络设备

[root@localhostnetwork-scripts]# nmcli device status

DEVICE                   TYPE     STATE         CONNECTION

eno16777736  ethernet connected     eno16777736

eno83886664  ethernet connected     Wired connection 1

eno33554960  ethernet disconnected  —

eno50332216  ethernet disconnected  —

eno67109440  ethernet disconnected  —

lo           loopback  unmanaged    —

DEVICE列能看到我们有5块网卡,名字为什么这么奇怪可以看命名规则的文章,因为我这用的是虚拟机,eno后的数字比较长,如果是在真实服务器上,你应该能看到eno1、eno2 ……,下图是网卡的配置文件,系统会自动创建,但也有可能没有,原因我也不清楚,没有也没关系,可以自己创建,所以如果你发现自己的服务器没有网卡配置文件也不要奇怪。

上面nmcli device status命令的输出结果我们再看一下,STATE状态这一行有connected和 disconnected,我一开始以为是有没有连接网线的,后来发现是表示有没有正确获取IP地址,上面的结果显示只有两块网卡正确获取IP,可能有朋友会问那不接网线会显示什么呢?

[root@localhostnetwork-scripts]# nmcli dev sta

DEVICE       TYPE     STATE         CONNECTION

eno83886664  ethernet connected     Wired connection 1

eno33554960  ethernet disconnected  —

eno50332216  ethernet disconnected  —

eno67109440  ethernet disconnected  —

eno16777736 ethernet  unavailable   —

lo           loopback  unmanaged    —

不接网线网络肯定没法用,所以显示unavailable网络不可用。细心的朋友有没有发现nmcli命令的不同,可以使用缩写,不知道红帽有没有借鉴思科,nmcli device status 可以缩写成 nmcli d s,命令不能缩写啊,可以补全,呵呵。

好了,网卡介绍就到这,下面我们看一下网卡的分配:

eno16777736 — eno1 — bond 0 (外网)

eno33554960 — eno2– bond 0

eno50332216 — eno3 — bond 1(内网)

eno67109440 — eno4– bond 1

eno83886664 — NAT

bond 0连接外网, bond 1连接内网,为了以后方便对网卡操作可以在配置文件中修改设备名。
3、配置Bonding

Centos 7 提供三种方式配置

nmtui

nmcli

cli

nmtui是一种图形化方式,刚开始可以使用这种方式。(配置bond会对网卡重新生成配置文件,系统自动生成的可以删除),我们先使用nmtui来配置。

配置完成后会生成三个配置文件,

配置文件可以精简一下:

[root@localhostnetwork-scripts]# cat ifcfg-bond0

DEVICE=bond0

TYPE=Bond

BONDING_MASTER=yes

BOOTPROTO=static

NAME=bond0

ONBOOT=yes

BONDING_OPTS=”resend_igmp=1updelay=0 use_carrier=1 miimon=100 downdelay=0 xmit_hash_policy=0primary_reselect=0 fail_over_mac=0 arp_validate=0 mode=balance-rr lacp_rate=0arp_interval=0 ad_select=0″

IPADDR=192.168.64.20

NETMASK=255.255.255.0

GATEWAY=192.168.64.2

DNS1=192.168.64.1

[root@localhostnetwork-scripts]# cat ifcfg-eno1

TYPE=Ethernet

NAME=eno1

DEVICE=eno16777736

ONBOOT=yes

MASTER=bond0

SLAVE=yes

[root@localhostnetwork-scripts]# cat ifcfg-eno2

TYPE=Ethernet

NAME=eno2

DEVICE=eno33554960

ONBOOT=yes

MASTER=bond0

SLAVE=yes

重启服务:

[root@localhostnetwork-scripts]# nmcli conn reload

[root@localhostnetwork-scripts]# systemctl restart network

][root@localhostnetwork-scripts]# nmcli  dev sta

DEVICE       TYPE     STATE         CONNECTION

bond0        bond      connected     bond0

eno16777736  ethernet connected     eno1

eno33554960  ethernet connected     eno2

eno83886664  ethernet connected     Wired connection 1

eno50332216  ethernet disconnected  —

eno67109440  ethernet disconnected  —

lo           loopback  unmanaged    —

[root@localhostnetwork-scripts]# ifconfig bond0

bond0:flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST>  mtu 1500

inet 192.168.220.20  netmask 255.255.255.0  broadcast 192.168.220.255

inet6 fe80::4d1:d2ff:fe5b:804a  prefixlen 64 scopeid 0x20<link>

ether 00:0c:29:d7:dc:0d  txqueuelen 0 (Ethernet)

RX packets 8  bytes 690 (690.0 B)

RX errors 0  dropped 0 overruns 0  frame 0

TX packets 2  bytes 138 (138.0 B)

TX errors 0  dropped 0 overruns 0  carrier 0 collisions 0
4、bond测试

我们的环境一共有5块网卡,2块刚才配置成bond0,有2块没有配置,也就没有IP,有1块用来连接ssh的有Ip地址,需要停用掉,否则影响实验效果,使用 ifdown 设备名将设备停用,详见下图:

最后使用 ip addr命令查看,确保只有bond0有ip地址就可以了,其他接口都使用ifdown停掉。

测试时使用  ifdown eno1断开一块网卡再测试。


5、CLI配置Bonding

可以直接修改配置文件来配置bonding,将之前的配置文件复制一份,把IP地址、device名称修改一下就可以了。

[root@localhostnetwork-scripts]# cat ifcfg-bond1

DEVICE=bond1

TYPE=Bond

BONDING_MASTER=yes

BOOTPROTO=static

NAME=bond1

ONBOOT=yes

BONDING_OPTS=”resend_igmp=1updelay=0 use_carrier=1 miimon=100 downdelay=0 xmit_hash_policy=0primary_reselect=0 fail_over_mac=0 arp_validate=0 mode=balance-rr lacp_rate=0arp_interval=0 ad_select=0″

IPADDR=192.168.64.30

NETMASK=255.255.255.0

GATEWAY=192.168.64.2

DNS1=192.168.64.2

[root@localhostnetwork-scripts]# cat ifcfg-eno3

TYPE=Ethernet

NAME=eno3

DEVICE=eno67109440

ONBOOT=yes

MASTER=bond1

SLAVE=yes

[root@localhostnetwork-scripts]# cat ifcfg-eno4

TYPE=Ethernet

NAME=eno4

DEVICE=eno50332216

ONBOOT=yes

MASTER=bond1

SLAVE=yes

重启网络服务,service命令系统还支持,但会提示转给 systemctl,可以直接使用 systemctl重启服务。

测试一下应该没问题的,所以以后要配置bond,可以直接修改配置文件就可以了。
6、使用nmcli命令创建Bonding

nmcli con add type bond ifname bond0 mode balance-rr      #创建master,模式为round-robin
nmcli con add type bond-slave ifname eno1 master bond0   #添加eno1为slave
nmcli con add type bond-slave ifname eno2 master bond0   #添加eno2为slave

十个免费的 Web 压力测试工具

本文列举了是十个免费工具,可以用来进行Web的负载/压力测试的。这样你就可以知道你的服务器以及你的WEB应用能够扛得住多少的并发量,以及网站性能。

0. Grinder–  Grinder是一个开源的JVM负载测试框架,它通过很多负载注射器来为分布式测试提供了便利。 支持用于执行测试脚本的Jython脚本引擎HTTP测试可通过HTTP代理进行管理。根据项目网站的说法,Grinder的 主要目标用户是“理解他们所测代码的人——Grinder不仅仅是带有一组相关响应时间的‘黑盒’测试。由于测试过程可以进行编码——而不是简单地脚本 化,所以程序员能测试应用中内部的各个层次,而不仅仅是通过用户界面测试响应时间。

1. Pylot-Pylot 是一款开源的测试web service性能和扩展性的工具,它运行HTTP 负载测试,这对容量计划,确定基准点,分析以及系统调优都很有用处。Pylot产生并发负载(HTTP Requests),检验服务器响应,以及产生带有metrics的报表。通过GUI或者shell/console来执行和监视test suites。

2. Web Capacity Analysis Tool (WCAT)– 这是一种轻量级负载生成实用工具,不仅能够重现对 Web 服务器(或负载平衡服务器场)的脚本 HTTP 请求,同时还可以收集性能统计数据供日后分析之用。WCAT 是多线程应用程序,并且支持从单个源控制多个负载测试客户端,因此您可以模拟数千个并发用户。该实用工具利用您的旧机器作为测试客户端,其中每个测试客户 端又可以产生多个虚拟客户端(最大数量取决于客户端机器的网络适配器和其他硬件)。您可以选择使用 HTTP 1.0 还是 HTTP 1.1 请求,以及是否使用 SSL。并且,如果测试方案需要,您还可以使用脚本执行的基本或 NTLM 身份验证来访问站点的受限部分。(如果您的站点使用 cookie、表单或基于会话的身份验证,那您可以创建正确的 GET 或 POST 请求来对测试用户进行身份验证。)WCAT 还可管理您站点可能设置的任何 cookie,所以配置文件和会话信息将永久保存。

3. fwptt– fwptt 也是一个用来进行WEB应用负载测试的工具。它可以记录一般的请求,也可以记录Ajax请求。它可以用来测试 asp.net, jsp, php 或是其它的Web应用。

4. JCrawler– JCrawler是一个开源(CPL) 的WEB应用压力测试工具。通过其名字,你就可以知道这是一个用Java写的像网页爬虫一样的工具。只要你给其几个URL,它就可以开始爬过去了,它用一 种特殊的方式来产生你WEB应用的负载。这个工具可以用来测试搜索引擎对你站点产生的负载。当然,其还有另一功能,你可以建立你的网站地图和再点击一下, 将自动提交Sitemap给前5名的搜索引擎!

5. Apache JMeter– Apache JMeter是一个专门为运行和服务器装载测试而设计的、100%的纯Java桌面运行程序。原先它是为Web/HTTP测试而设计的,但是它已经扩展以 支持各种各样的测试模块。它和用于HTTP和SQL数据库(使用JDBC)的模块一起运送。它可以用来测试静止资料库或者活动资料库中的服务器的运行情 况,可以用来模拟对服务器或者网络系统加以重负荷以测试它的抵抗力,或者用来分析不同负荷类型下的所有运行情况。它也提供了一个可替换的界面用来定制数据 显示,测试同步及测试的创建和执行。

6. Siege-Siege(英文意思是围攻)是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每 个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。 Siege 支持基本的认证,cookies, HTTP 和 HTTPS 协议。

7. http_load– http_load 以并行复用的方式运行,用以测试web服务器的吞吐量与负载。但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不会把客户机搞死。可以可以测试HTTPS类的网站请求。

8. Web Polygraph– Web Polygraph这个软件也是一个用于测试WEB性能的工具,这个工具是很多公司的标准测试工具,包括微软在分析其软件性能的时候,也是使用这个工具做为基准工具的。很多招聘测试员的广告中都注明需要熟练掌握这个测试工具。

9. OpenSTA– OpenSTA是一个免费的、开放源代码的web性能测试工具,能录制功能非常强大的脚本过程,执行性能测试。例如虚拟多个不同的用户同时登陆被测试网 站。其还能对录制的测试脚本进行,按指定的语法进行编辑。在录制完测试脚本后,可以对测试脚本进行编辑,以便进行特定的性能指标分析。其较为丰富的图形化 测试结果大大提高了测试报告的可阅读性。OpenSTA 基于CORBA 的结构体系,它通过虚拟一个proxy,使用其专用的脚本控制语言,记录通过 proxy 的一切HTTP/S traffic。通过分析OpenSTA的性能指标收集器收集的各项性能指标,以及HTTP 数据,对系统的性能进行分析。

欢迎您留下你认为不错的WEB应用性能测试的工具。

英文原文:10 Free Tools to Load/Stress Test Your Web Applications

CentOS下为Web网站性能做测试

Webbench是知名的网站压力方面的测试工具,它是由Lionbridge公司开发。

官方主页:http://home.tiscali.cz/~cz210552/webbench.html

在运维工作中,网站压力及性能测试是一项很重要的工作。比如在一个网站上线之前,能承受多大访问量、在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验。但是,在压力及性能测试中存在一个共性,那就是压力及性能测试的结果与实际负载结果不会完全相同,就算压力及性能测试工作做的再好,也不能保证100%和线上性能指标相同。面对这些问题,我们只能尽量去想方设法去模拟。所以,压力及性能测试非常有必要,有了这些数据,我们就能对自己做维护的平台做到心中有数。

Web Bench最多可以模拟3万个并发连接去测试网站的负载能力。Web Bench能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况。Web Bech的标准测试可以向我们展示服务器的两项内容:每秒钟相应请求数和每秒钟传输数据量。Web Bench不但能具有静态页面的测试能力,还能对动态页面(ASP,PHP,JAVA,CGI)进行测试的能力。还有就是他支持对含有SSL的安全网站例如电子商务网站进行静态或动态的性能测试。

适用于linux操作系统

1、WebBench安装:

  1. cd /usr/local/src 
  2. wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz 
  3. tar zxvf webbench1.5.tar.gz 
  4. cd webbench1.5 
  5. make 
  6. make install 

补充:安装过程中如提示缺少组件请安装,缺少目录,请手动创建。

常见错误:

cc -Wall -ggdb -W -O -c -o webbench.o webbench.c

webbench.c: In function ‘alarm_handler’:

webbench.c:77: warning: unused parameter ’signal’

cc -Wall -ggdb -W -O -o webbench webbench.o

ctags *.c

/bin/sh: ctags: command not found

make: [tags] Error 127 (ignored)

centos有相应的组件,搜索一下ctags安装即可

  1. # yum install ctags 

2、WebBench使用:

  1. #webbench -c 1000 -t 60 http://test.cn/info.php 
  2. webbench c 并发数 t 运行测试时间  URL 

3、测试结果示例:

  1. #webbench -c 600 -t 30 http://test.cn/index.php 
  2. Webbench Simple Web Benchmark 1.5 
  3. Copyright (c) Radim Kolar 19972004, GPL Open Source Software. 
  4.  
  5. Benchmarking: GET http://test.cn/index.php 
  6. 600 clients, running 30 sec. 
  7.  
  8. Speed=12082 pages/min, 152635 bytes/sec. 
  9. Requests: 6041 susceed, 0 failed. 
  10.  
  11. ————————————————————————————- 
  12.  
  13. #webbench -c 1000 -t 60 http://test.cn/index.php 
  14. Webbench Simple Web Benchmark 1.5 
  15. Copyright (c) Radim Kolar 19972004, GPL Open Source Software. 
  16.  
  17. Benchmarking: GET http://test.cn/index.php 
  18. 1000 clients, running 60 sec. 
  19.  
  20. Speed=5553 pages/min, 70152 bytes/sec. 
  21. Requests: 5553 susceed, 0 failed. 

每秒钟响应请求数:24525/60= X pages/sec,每秒钟传输数据量20794612 bytes/sec.

  1. # webbench -c 2000 -t 60 http://test.cn/index.php 
  2. Webbench Simple Web Benchmark 1.5 
  3. Copyright (c) Radim Kolar 19972004, GPL Open Source Software. 
  4.  
  5. Benchmarking: GET http://test.cn/index.php 
  6. 2000 clients, running 60 sec. 
  7.  
  8. Speed=10479 pages/min, 132043 bytes/sec. 
  9. Requests: 10453 susceed, 26 failed. 

当并发2000时,已经显示有26个连接failed了,说明超负荷了。

补充:

  • 压力及性能测试工作应该放到产品上线之前,而不是上线以后;
  • 测试时并发应当由小逐渐加大,比如并发100时观察一下网站负载是多少、打开页面是否流畅,并发200时又是多少、网站打开缓慢时并发是多少、网站打不开时并发又是多少;
  • 更详细的进行某个页面测试,如电商网站可以着重测试购物车、推广页面等,因为这些页面占整个网站访问量比重较大。

备注:webbench 做压力及性能测试时,该软件自身也会消耗CPU和内存资源,为了测试准确,建议将 webbench安装在其他的服务器上,已达到测试数据更加精确。

CentOS服务器的性能分析与优化

作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行,但硬件问题、软件问题、网络环境等的复杂性和多变性,导致了对系统的优化变得异常复杂,如何定位性能问题出在哪个方面,是性能优化的一大难题。 本文从系统入手,重点讲述由于系统软、硬件配置不当造成的性能问题,并且给出了检测系统故障和优化性能的一般方法和流程。

一、 系统性能分析的目的

1.1 找到系统性能的瓶颈

系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员可能经常会遇到系统不稳定、响应速度慢等问题,例如在Linux上搭建了一个Web服务,经常出现网页无法打开、打开速度慢等现象。遇到这些问题,就有人会抱怨Linux系统不好,其实这些都是表面现象。操作系统完成一个任务是与系统自身设置、网络拓朴结构、路由设备、路由策略、接入设备、物理线路等多个方面都密切相关的,任何一个环节出现问题,都会影响整个系统的性能。因此,当Linux应用出现问题时,应当从应用程序、操作系统、服务器硬件、网络环境等方面综合排查,定位问题出现在哪个部分,然后集中解决。

1.2 提供性能优化方案

查找系统性能瓶颈是个复杂而耗时的过程,需要在应用程序、操作系统、服务器硬件、网络环境等方面进行查找和定位,影响性能最大的是应用程序和操作系统两个方面,因为这两个方面出现的问题不易察觉,隐蔽性很强。而硬件、网络方面出现的问题,一般都能马上定位。一旦找到了系统性能问题,解决起来就非常迅速和容易,例如发现系统硬件存在问题,如果是物理故障,那么更换硬件就可以了,如果是硬件性能不能满足需求,升级硬件就可以了;如果发现是网络问题,比如带宽不够、网络不稳定,只需优化和升级网络即可;如果发现是应用程序问题,修改或优化软件系统即可;而如果是操作系统配置问题,修改系统参数、修改系统配置即可。

可见,只要找到了性能瓶颈,就可以提供性能优化方案,有标准、有目的地进行系统优化。

1.3 使系统硬件和软件资源的使用达到平衡

Linux操作系统是一个开源产品,也是一个开源软件的实践和应用平台,在这个平台下由无数的开源软件支撑,常见的有Apache、Tomcat、MySQL、PHP等。开源软件的最大理念是自由、开放,那么Linux作为一个开源平台,最终要实现的是通过这些开源软件的支持,以最低廉的成本,达到应用性能的最优化。但是,系统的性能问题并非是孤立的,解决了一个性能瓶颈,可能会出现另一个性能瓶颈,所以说性能优化的最终目的是:在一定范围内使系统的各项资源使用趋于合理并保持一定的平衡,即系统运行良好的时候恰恰就是系统资源达到了一个平衡状态的时候。而在操作系统中,任何一项资源的过度使用都会破坏这种平衡状态,从而导致系统响应缓慢或者负载过高。例如,CPU资源的过度使用会造成系统中出现大量的等待进程,导致应用程序响应缓慢,而进程的大量增加又会导致系统内存资源的增加,当物理内存耗尽时,系统就会使用虚拟内存,而虚拟内存的使用又会造成磁盘I/O的增加并加大CPU的开销。因此,系统性能的优化就是在硬件、操作系统、应用软件之间找到一个平衡点。

二、 分析系统性能涉及的人员

2.1        Linux系统管理人员

在做性能优化过程中,系统管理人员承担着很重要的任务,首先,系统管理人员要了解和掌握操作系统的当前运行状态,例如系统负载、内存状态、进程状态、CPU负荷等信息,这些信息是检测和判断系统性能的基础和依据;其次,系统管理人员还有掌握系统的硬件信息,例如磁盘I/O、CPU型号、内存大小、网卡带宽等参数信息,然后根据这些信息综合评估系统资源的使用情况;第三,作为一名系统管理人员,还要掌握应用程序对系统资源的使用情况,更深入的一点就是要了解应用程序的运行效率,例如是否有程序BUG、内存溢出等问题,通过对系统资源的监控,就能发现应用程序是否存在异常,如果确实是应用程序存在问题,需要把问题立刻反映给程序开发人员,进而改进或升级程序。

性能优化本身就是一个复杂和繁琐的过程,系统管理人员只有了解了系统硬件信息、网络信息、操作系统配置信息和应用程序信息才能有针对性地的展开对服务器性能优化,这就要求系统管理员有充足的理论知识、丰富的实战经验以及缜密分析问题的头脑。

2.2        系统架构设计人员

系统性能优化涉及的第二类人员就是应用程序的架构设计人员。如果系统管理人员在经过综合判断后,发现影响性能的是应用程序的执行效率,那么程序架构设计人员就要及时介入,深入了解程序运行状态。首先,系统架构设计人员要跟踪了解程序的执行效率,如果执行效率存在问题,要找出哪里出现了问题;其次,如果真的是架构设计出现了问题,那么就要马上优化或改进系统架构,设计更好的应用系统架构。

2.3        软件开发人员

系统性能优化最后一个环节涉及的是程序开发人员,在系统管理员或架构设计人员找到程序或结构瓶颈后,程序开发人员要马上介入进行相应的程序修改。修改程序要以程序的执行效率为基准,改进程序的逻辑,有针对性地进行代码优化。例如,系统管理人员在系统中发现有条SQL语句耗费大量的系统资源,抓取这条执行的SQL语句,发现此SQL语句的执行效率太差,是开发人员编写的代码执行效率低造成的,这就需要把这个信息反馈给开发人员,开发人员在收到这个问题后,可以有针对性的进行SQL优化,进而实现程序代码的优化。

从上面这个过程可以看出,系统性能优化一般遵循的流程是:首先系统管理人员查看系统的整体状况,主要从系统硬件、网络设备、操作系统配置、应用程序架构和程序代码五个方面进行综合判断,如果发现是系统硬件、网络设备或者操作系统配置问题,系统管理员可以根据情况自主解决;如果发现是程序结构问题,就需要提交给程序架构设计人员;如果发现是程序代码执行问题,就交给开发人员进行代码优化。这样就完成了一个系统性能优化的过程。

三、影响Linux性能的各种因素

3.1 系统硬件资源

1.CPU

CPU是操作系统稳定运行的根本,CPU的速度与性能在很大程度上决定了系统整体的性能,因此,CPU数量越多、主频越高,服务器性能也就相对越好。但事实并非完全如此。

目前大部分CPU在同一时间内只能运行一个线程,超线程的处理器可以在同一时间运行多个线程,因此,可以利用处理器的超线程特性提高系统性能。在Linux系统下,只有运行SMP内核才能支持超线程,但是,安装的CPU数量越多,从超线程获得的性能方面的提高就越少。另外,Linux内核会把多核的处理器当作多个单独的CPU来识别,例如两个4核的CPU,在Lnux系统下会被当作8个单核CPU。但是从性能角度来讲,两个4核的CPU和8个单核的CPU并不完全等价,根据权威部门得出的测试结论,前者的整体性能要比后者低25%~30%。

可能出现CPU瓶颈的应用有邮件服务器、动态Web服务器等,对于这类应用,要把CPU的配置和性能放在主要位置。

2.内存

内存的大小也是影响Linux性能的一个重要的因素,内存太小,系统进程将被阻塞,应用也将变得缓慢,甚至失去响应;内存太大,导致资源浪费。Linux系统采用了物理内存和虚拟内存两种方式,虚拟内存虽然可以缓解物理内存的不足,但是占用过多的虚拟内存,应用程序的性能将明显下降,要保证应用程序的高性能运行,物理内存一定要足够大;但是过大的物理内存,会造成内存资源浪费,例如,在一个32位处理器的Linux操作系统上,超过8GB的物理内存都将被浪费。因此,要使用更大的内存,建议安装64位的操作系统,同时开启Linux的大内存内核支持。

由于处理器寻址范围的限制,在32位Linux操作系统上,应用程序单个进程最大只能使用2GB的内存,这样以来,即使系统有更大的内存,应用程序也无法“享”用,解决的办法就是使用64位处理器,安装64位操作系统。在64位操作系统下,可以满足所有应用程序对内存的使用需求 ,几乎没有限制。

可能出现内存性能瓶颈的应用有打印服务器、数据库服务器、静态Web服务器等,对于这类应用要把内存大小放在主要位置。

3.磁盘I/O性能

磁盘的I/O性能直接影响应用程序的性能,在一个有频繁读写的应用中,如果磁盘I/O性能得不到满足,就会导致应用停滞。好在现今的磁盘都采用了很多方法来提高I/O性能,比如常见的磁盘RAID技术。

RAID的英文全称为:Redundant Array of Independent Disk,即独立磁盘冗余阵列,简称磁盘阵列。RAID通过将多块独立的磁盘(物理硬盘)按不同方式组合起来形成一个磁盘组(逻辑硬盘),从而提供比单个硬盘更高的I/O性能和数据冗余。

通过RAID技术组成的磁盘组,就相当于一个大硬盘,用户可以对它进行分区格式化、建立文件系统等操作,跟单个物理硬盘一模一样,唯一不同的是RAID磁盘组的I/O性能比单个硬盘要高很多,同时在数据的安全性也有很大提升。

根据磁盘组合方式的不同,RAID可以分为RAID0,RAID1、RAID2、RAID3、RAID4、RAID5、RAID6、RAID7、RAID0+1、RAID10等级别,常用的RAID级别有RAID0、RAID1、RAID5、RAID0+1,这里进行简单介绍。

RAID 0:通过把多块硬盘粘合成一个容量更大的硬盘组,提高了磁盘的性能和吞吐量。这种方式成本低,要求至少两个磁盘,但是没有容错和数据修复功能,因而只能用在对数据安全性要求不高的环境中。

RAID 1:也就是磁盘镜像,通过把一个磁盘的数据镜像到另一个磁盘上,最大限度地保证磁盘数据的可靠性和可修复性,具有很高的数据冗余能力,但磁盘利用率只有50%,因而,成本最高,多用在保存重要数据的场合。

RAID5:采用了磁盘分段加奇偶校验技术,从而提高了系统可靠性,RAID5读出效率很高,写入效率一般,至少需要3块盘。允许一块磁盘故障,而不影响数据的可用性。

RAID0+1:把RAID0和RAID1技术结合起来就成了RAID0+1,至少需要4个硬盘。此种方式的数据除分布在多个盘上外,每个盘都有其镜像盘,提供全冗余能力,同时允许一个磁盘故障,而不影响数据可用性,并具有快速读/写能力。

通过了解各个RAID级别的性能,可以根据应用的不同特性,选择适合自身的RAID级别,从而保证应用程序在磁盘方面达到最优性能。

4.网络宽带

Linux下的各种应用,一般都是基于网络的,因此网络带宽也是影响性能的一个重要因素,低速的、不稳定的网络将导致网络应用程序的访问阻塞,而稳定、高速的网络带宽,可以保证应用程序在网络上畅通无阻地运行。幸运的是,现在的网络一般都是千兆带宽或光纤网络,带宽问题对应用程序性能造成的影响也在逐步降低。

3.2 操作系统相关资源

基于操作系统的性能优化也是多方面的,可以从系统安装、系统内核参数、网络参数、文件系统等几个方面进行衡量,下面依次进行简单介绍。

1.系统安装优化

系统优化可以从安装操作系统开始,当安装Linux系统时,磁盘的划分,SWAP内存的分配都直接影响以后系统的运行性能,例如,磁盘分配可以遵循应用的需求:对于对写操作频繁而对数据安全性要求不高的应用,可以把磁盘做成RAID 0;而对于对数据安全性较高,对读写没有特别要求的应用,可以把磁盘做成RAID 1;对于对读操作要求较高,而对写操作无特殊要求,并要保证数据安全性的应用,可以选择RAID 5;对于对读写要求都很高,并且对数据安全性要求也很高的应用,可以选择RAID 01。这样通过不同的应用需求设置不同的RAID级别,在磁盘底层对系统进行优化操作。

随着内存价格的降低和内存容量的日益增大,对虚拟内存SWAP的设定,现在已经没有了所谓虚拟内存是物理内存两倍的要求,但是SWAP的设定还是不能忽略,根据经验,如果内存较小(物理内存小于4GB),一般设置SWAP交换分区大小为内存的2倍;如果物理内存大于4GB小于16GB,可以设置SWAP大小等于或略小于物理内存即可;如果内存大小在16GB以上,原则上可以设置SWAP为0,但并不建议这么做,因为设置一定大小的SWAP还是有一定作用的。

2.内核参数优化

系统安装完成后,优化工作并没有结束,接下来还可以对系统内核参数进行优化,不过内核参数的优化要和系统中部署的应用结合起来整体考虑。例如,如果系统部署的是Oracle数据库应用,那么就需要对系统共享内存段(kernel.shmmax、kernel.shmmni、kernel.shmall)、系统信号量(kernel.sem)、文件句柄(fs.file-max)等参数进行优化设置;如果部署的是Web应用,那么就需要根据Web应用特性进行网络参数的优化,例如修改net.ipv4.ip_local_port_range、net.ipv4.tcp_tw_reuse、net.core.somaxconn等网络内核参数。

3.文件系统优化

文件系统的优化也是系统资源优化的一个重点,在Linux下可选的文件系统有ext2、ext3、xfs、ReiserFS,根据不同的应用,选择不同的文件系统。

Linux标准文件系统是从VFS开始的,然后是ext,接着就是ext2,应该说,ext2是Linux上标准的文件系统,ext3是在ext2基础上增加日志形成的,从VFS到ext3,其设计思想没有太大变化,都是早期UNIX家族基于超级块和inode的设计理念。

XFS文件系统是SGI开发的一个高级日志文件系统,后来移植到了Linux系统下,XFS通过分布处理磁盘请求、定位数据、保持Cache 的一致性来提供对文件系统数据的低延迟、高带宽的访问,因此,XFS极具伸缩性,非常健壮,具有优秀的日志记录功能、可扩展性强、快速写入性能等优点。

ReiserFS是在Hans Reiser领导下开发出来的一款高性能的日志文件系统,它通过完全平衡树结构来管理数据, 包括文件数据,文件名及日志支持等,与ext2/ext3相比,最大的优点是访问性能和安全性大幅提升。ReiserFS具有高效、合理利用磁盘空间,先进的日志管理机制,特有的搜寻方式,海量磁盘存储等优点。

3.3 应用程序软件资源

应用程序的优化其实是整个优化工程的核心,如果一个应用程序存在BUG,那么即使所有其他方面都达到了最优状态,整个应用系统还是性能低下,所以,对应用程序的优化是性能优化过程的重中之重,这就对程序架构设计人员和程序开发人员提出了更高的要求。

一、几种典型应用对系统资源使用的特点

1.1 以静态内容为主的Web应用

这类应用的一个主要特点是小文件居多,并且读操作频繁,Web服务器一般为Apache或Nginx,因为这两个HTTP服务器对静态资源的处理非常迅速和高效。在Web访问量不大时,可以直接对外提供服务,但是在有很大并发请求时,单一的Web服务无法支撑大量的客户端访问,此时就需要由多台Web服务器组成的负载集群系统。为了实现更高效的访问,在最前端还可以搭建Cache服务器,也就是将静态资源文件缓存到操作系统内存中直接进行读操作,因为直接从内存读取数据要比从硬盘读数据效率高很多,所以在Web前端搭建Cache服务器可以大大提高并发访问性能。常用的Cache软件有Squid、Varinsh等。

Cache服务器虽然可以提高访问性能,但要求服务器有很大的内存,当系统内存充足时,可以缓解磁盘随机读的压力;当内存过小或者内存不足时,系统就会使用虚拟内存,而虚拟内存的使用会引起磁盘I/O的增大,当磁盘I/O增大时,CPU的开销也随之增加。

在高并发访问时,还存在另外一个问题,就是网络带宽瓶颈,如果客户端访问量很大且带宽不够,就会阻塞网络,影响访问,因此,在构建基于Web的网络应用时,网络带宽也是必须考虑的一个因素。

1.2 以动态内容为主的Web应用

这类应用的一个特点是频繁地执行写操作,例如Java、PHP、Perl、CGI等,会导致CPU资源消耗严重。因为动态程序的执行要进行编译、读取数据库等操作,而这些操作都会消耗CPU资源,因此,一个基于动态程序的Web应用,应该选择多个性能较高的CPU,这将对系统整体性能的提高有很大帮助。

基于动态内容的Web应用在高并发访问时,系统执行的进程数会很多,因此要注意负载的分配。由于过多的进程会消耗大量系统内存,如果内存不足,就会使用虚拟内存,而虚拟内存的增加会导致磁盘写操作频繁,进而消耗CPU资源,因此要寻求一个硬件资源和软件资源的平衡点,例如配置较大的内存和高性能的CPU,而在软件方面可通过如Memcached加快程序与数据库之间的访问效率。

1.3 数据库应用

数据库应用的一个主要特点是消耗内存和磁盘I/O,而对CPU的消耗并不是很大,因此最基本的做法就是为数据库服务器配置较大的内存和读写较快的磁盘阵列,例如,可以为数据库服务器的磁盘选择RAID5、RAID01等RAID级别。将Web Server与DB Server分离也是优化数据库应用的一个常用做法。如果客户端用户对数据库的请求过大,还可以考虑采取数据库的负载均衡方案,通过软件负载均衡或硬件负载均衡的方式提高数据库访问性能。

对于数据库中过大的表,可以考虑进行拆分,也就是将一个大表拆分成多个小表,再通过索引进行关联处理,这样可以避免查询大表造成的性能问题,因为表太大时,查询遍历全表会造成磁盘读操作激增,进而出现读操作等待的情况。同时,数据库中查询语句复杂,大量的where子句,order by、group by排序语句等,容易使CPU出现瓶颈。最后,当数据更新时,数据更新量大或更新频繁,也会造成磁盘写操作激增,出现写操作的瓶颈。这些也应该在程序代码中避免。

在日常应用中,还有一种方法可以显著提高数据库服务器的性能,那就是读写分离。 同时对数据库进行读和写的操作,是效率极低的一种访问方式,较好的做法是根据读、写的压力和需求,分别建立两台结构完全相同的数据库服务器,将负责写的台服务器上的数据,定时复制给负责读的服务器,通过读写的协作提高系统整体性能。

通过缓存方式也可以提高数据库的性能, 缓存是数据库或对象在内存中的临时容器,使用缓存可大幅减少数据库的读取操作,改由内存来提供数据。比如可以在 Web Server和DB Server之间增加一层数据缓存层,在系统内存中建立被频繁请求对象的副本,这样一来,不访问数据库也可为程序提供数据,现在应用很广泛的Memcached就是基于这个原理。

1.4 软件下载应用

静态资源下载服务器的主要特点是带宽消耗严重,同时对存储性能要求也很高,在下载量极高时,可以采用多台、多点服务器分流形式分担下载负荷,在HTTP服务器方面,从高性能角度和减少服务器部署的角度考虑,推荐采用Lighttpd HTTP服务器,而不是采用传统的Apache服务器,原因是Apache使用阻塞模式的I/O操作,性能相对较差,并发能力有限,而Lighttpd使用异步I/O方式,处理资源下载的并发能力远远超过Apache。

1.5 流媒体服务应用

流媒体主要应用在视频会议、视频点播、远程教育、在线直播等方面,这类应用主要的性能瓶颈是网络带宽和存储系统带宽(主要是读操作),面对海量用户,如何保障用户接收到高清晰的、流畅的画面,如何最大限度地节省网络带宽,这些都是流媒体应用要解决的首要问题。

对于流媒体服务器的优化,可以从存储策略、传输策略、调度策略、代理服务器缓存策略及流媒体服务器的体系结构设计等几个方面进行考虑。在存储方面,需要对视频的编码格式进行优化,进而节省空间,优化存储性能;在传输方面,可以采用智能流技术控制发送的速率,最大程度保障用户观看视频的流畅性;在调度方面,可以采用静态调度和动态调度结合的方法;在代理服务器方面,可以采用分段缓存、动态缓存等管理策略;在流媒体体系结构方面,可以采用内存池和线程池技术改善内存消耗和线程过多对性能造成的影响。

基于Web应用的性能分析及优化案例

一、 基于动态内容为主的网站优化案例

1.网站运行环境说明

硬件环境:1台IBM x3850服务器, 单个双核Xeon 3.0G CPU,2GB内存,3块72GB SCSI磁盘。

操作系统:CentOS5.4。

网站架构:Web应用是基于LAMP架构,所有服务都在一台服务器上部署。

2.性能问题现象及处理措施

现象描述

网站在上午10点左右和下午3点左右访问高峰时,网页无法打开,重启服务后,网站能在一段时间内能正常服务,但过一会又变得响应缓慢,最后网页彻底无法打开。

检查配置

首先检查系统资源状态,发现服务出现故障时系统负载极高,内存基本耗尽,接着检查Apache配置文件httpd.conf,发现“MaxClients”选项值被设置为2000,并且打开了Apache的KeepAlive特性。

处理措施

根据上面的检查,初步判断是Apache的”MaxClients“选项配置不当引起的,因为系统内存仅有2GB大小,而“MaxClients”选项被配置为2000,过多的用户访问进程耗尽了系统内存;然后,修改httpd.conf配置文件的“MaxClients”选项,将此值由2000降到1500;继续观察发现,网站还是频繁宕机,于是又将“MaxClients”选项值降到1024,观察一段时间发现,网站服务宕机时间间隔加长了,不像以前那么频繁,但是系统负载还是很高,网页访问速度极慢。

3.第一次分析优化

既然是由系统资源耗尽导致的网站服务失去响应,那么就深入分析系统资源的使用情况,通过uptime、vmstat、top、ps等命令的联合使用,得出如下结论:

结论描述

系统平均负载很高,通过uptime输出的系统“load average”值都在10以上,而CPU资源也消耗严重,这是造成网站响应缓慢或长时间没有响应的主要原因,而导致系统资源消耗过高的主要依据是用户进程消耗资源严重。

原因分析

通过top命令发现,每个Apache子进程消耗将近6~8MB左右内存,这是不正常的。根据经验,在正常情况下每个Apache子进程消耗的内存在1MB左右,结合Apache输出日志发现,网站首页访问频率最高,也就是说首页程序代码可能存在问题。于是检查首页的PHP代码,发现首页的页面非常大,图片很多,并且由全动态的程序组成,这样每次用户访问首页都要多次查询数据库,而查询数据库是个非常耗费CPU资源的过程,并且首页PHP代码也没有相应的缓存机制,每个用户请求都要重新进行数据库查询操作,数据库查询负荷有多高可想而知。

处理措施

修改首页PHP代码,缩减页面大小,并且对访问频繁的操作增加缓存机制,尽量减少程序对数据库的访问。

4.第二次分析优化

通过前面简单优化,系统服务宕机现象出现次数减少很多,但是在访问高峰时网站偶尔还会无法正常访问。这次仍然从分析系统资源使用状况入手,发现系统内存资源消耗过大,并且磁盘I/O有等待问题,于是得出如下结论:

原因分析

内存消耗过大,肯定是用户访问进程数过多导致的,在没有优化PHP代码之前,每个Apache子进程消耗6~8MB内存,如果设置Apache的最大用户数为1024,那么内存耗尽是必然的,当物理内存耗尽时,虚拟内存就会启用,频繁地使用虚拟内存,肯定会出现磁盘I/O等待问题,最终导致CPU资源耗尽。

处理措施

通过上面对PHP代码的优化,每个Apache子进程消耗的内存资源基本维持在1~2MB左右,因此修改Apache配置文件httpd.conf中的”MaxClients”选项值为“600”,同时把Apache配置中的“KeepAlive”特性关闭,这样Apache进程数大量减少,基本维持在500~600之间,虽然偶尔也会使用虚拟内存,但是Web服务正常了,服务宕机问题也很少出现了。

5.第三次分析优化

经过前两次的优化,网站基本运行正常,但是在访问高峰时偶尔还会出现站点无法访问得现象,继续进行问题分析,通过命令查看系统资源,发现仍是CPU资源耗尽导致的,但是与前两次又有所不同:

原因分析

通过观察后台日志,发现PHP程序有频繁访问数据库的操作,大量的SQL语句中有where, order by等子句;同时,数据库查询过多,大部分都是复杂查询,一般都需要遍历全表,而大量的表没有建立索引,这样的程序代码导致MySQL数据库负荷过高,而MySQL数据库和Apache部署在同一台服务器上,这也是导致服务器消耗CPU资源过高的原因。

处理措施

优化程序中的SQL语句,增加where子句上的匹配条件,减少遍历全部的查询,同时在where和order by子句的字段上建立索引,并且增加程序缓存机制,通过这次优化,网站运行基本处于正常状态,再也没有出现宕机的现象。

6.第四次优化分析

通过前面三次优化以后,网站在程序代码、操作系统、Apache等方面的优化空间越来越小,要避免出现服务气宕机现象,并且保证网站稳定、高效、快速地运行,可以从网站结构上进行优化,也就是将Web和数据库分离部署,可以增加一台专用的数据库服务器,单独部署MySQL数据库。随着访问量的增加,如果前端无法满足访问请求,还可以增加多台Web服务器,Web服务器之间进行负载均衡部署,解决前端性能瓶颈;如果在数据库端还存在读写压力,还可以继续增加一台MySQL服务器,将MySQL进行读写分离部署,这样一套高性能、高可靠的网站系统就构建起来了。

二、  基于动态、静态内容结合的网站优化案例

1.网站运行环境说明

硬件环境:两台IBM x3850服务器, 单个双核Xeon 3.0G CPU,4GB内存,3块72GB SCSI磁盘。

操作系统:CentOS5.4。

网站架构:Web应用是基于J2EE架构的电子商务应用,Web端应用服务器是Tomcat,采用MySQL数据库,Web和数据库独立部署在两台服务器上。

2.性能问题现象以及处理措施

现象描述

网站访问高峰时,网页无法打开,重启Java服务后,网站可以正常运行一段时间,但过一会又变得响应缓慢,最后网页彻底无法打开。

检查配置

首先检查系统资源状态,发现服务出现故障时系统负载极高,CPU满负荷运行,Java进程占用了系统99%的CPU资源,但内存资源占用不大;接着检查应用服务器信息,发现只有一个Tomcat在运行Java程序;接着查看Tomcat配置文件server.xml,发现server.xml文件中的参数都是默认配置,没有进行任何优化。

处理措施

server.xml文件的默认参数需要根据应用的特性进行适当的修改,例如可以修改“connectionTimeout“、“maxKeepAliveRequests”、“maxProcessors”等几个Tmcat配置文件的参数,适当加大这几个参数值。修改参数值后,继续观察发现,网站服务宕机时间间隔加长了,不像以前那么频繁,但是Java进程消耗CPU资源还是很严重,网页访问速度极慢。

3.第一次分析优化

既然Java进程消耗CPU资源严重,那么需要查看到底是什么导致Java消耗资源严重,通过lsof、netstat命令发现有大量的Java请求等待信息,然后查看Tomcat日志,发现大量报错信息、日志提示和数据库连接超时,最终无法连接到数据库,同时,访问网站静态资源,也无法访问,于是得出如下结论:

原因分析

Tomcat本身就是一个Java容器,是使用连接/线程模型处理业务请求的,主要用于处理Jsp、servlet等动态应用,虽然它也能当作HTTP服务器,但是处理静态资源的效率很低,远远比不上Apache或Nginx。从前面观察到的现象分析,可以初步判断是Tomcat无法及时响应客户端的请求,进而导致请求队列越来越多,直到Tomcat彻底崩溃。对于一个正常的访问请求来说,服务器接收到请求后,会把请求交给Tomcat去处理,Tomcat接着执行编译、访问数据库等操作,然后把信息返回给客户端,客户端接收到信息后,Tomcat就关闭这个请求链接,这样一个完整的访问过程就结束了。而在高并发访问状态下,很多的请求瞬间都交给Tomcat处理,这样Tomcat还没有完成第一个请求,第二个请求就来了,接着是第三个,等等,这样越积越多,Tomcat最终失去响应, Java进程就会处于僵死状态,资源无法释放,这就是根本原因。

处理措施

要优化Tomcat性能,需要从结构上进行重构,首先,加入Apache支持,由Apache处理静态资源,由Tomcat处理动态请求,Apache服务器和Tomcat服务器之间使用Mod_JK模块进行通信。使用Mod_JK模块的好处是:它可以定义详细的资源处理规则,根据动态、静态网站的特点,将静态资源文件全部交给Apache处理,而动态请求通过Mod_JK模块传给Tomcat去处理,通过Apache+JK+Tomcat的整合,可以大幅度提高Tomcat应用的性能。

4.第二次分析优化

经过前面的优化措施,Java资源偶尔会增高,但是一段时间后又会自动降低,这属于正常状态,而在高并发访问情况下,Java进程有时还会出现资源上升无法下降的情况,通过查看Tomcat日志,综合分析得出如下结论:

要获得更高、更稳定的性能,单一的Tomcat应用服务器有时会无法满足需求,因此要结合Mod_JK模块运行基于Tomcat的负载均衡系统,这样前端由Apache负责用户请求的调度,后端又多个Tomcat负责动态应用的解析操作,通过将负载均分配给多个Tomcat服务器,网站的整体性能会有一个质的提升。