HIS配置优化建议
HIS实际上是IBM和Apache合作的一个产物,它基于稳定版的Apache webserver代码树,然后做了一些扩展,优化而来,所以在本质上各个参数和Apache webserver基本上是一样的,如下就从四个方面对HIS配置进行优化建议:
一、 worker MPM和IHS基本原理
1. worker MPM是多进程多线程的混合模式,使用线程来处理请求,可以获得处理海量请求,由于每个进程都要占用独立的内存单元,所以多进程耗内存,由于多线程是共享内存单元的,所以省内存,但是由于一个进程中的一个线程死掉,整个进程会死掉(多线程的缺点),所以多线程具有不稳定性,以多进程和多线程的结合,即服务器建立多个子进程,每个子进程有建立多个线程,以获得基于进程服务器的稳定性。
2.IHS就是基于worker MPM的模式,其工作原理是IHS根据负载的情况,增加或减少进程数量,一个单独的父控制进程负责管理(建立或删除)子进程,每个子进程可以建立多个服务线程和一个监听线程,监听线程监听请求并转发给服务线程处理。
二、 参数说明
参数设置文件路径:
IHS的参数配置文件:{ IHS_HOME }/conf/httppd.conf
配置中的重点参数:
#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 0
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 16
##
## Server-Pool Size Regulation (MPM specific)
##
# worker MPM
# ThreadLimit: maximum setting of ThreadsPerChild
# ServerLimit: maximum setting of StartServers
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
ThreadLimit 2000
ServerLimit 500
StartServers 50
MaxClients 2000
MinSpareThreads 25
MaxSpareThreads 200
ThreadsPerChild 1000
MaxRequestsPerChild 0
</IfModule>
参数说明:
KeepAlive
KeepAlive从英文的页面翻译看,是指在一次连接中是否允许处理多于一个的请求,即为持久连接,其配置决定了处理完客户端的HTTP请求后是否关闭TCP连接,即客户端访问后,是否始终保持连接,从而客户端如果还有请求,则会继续在这次连接中完成,而不需要重新建立新的TCP连接,这个可以减少客户端反复创建TCP连接和关闭TCP连接的时间,从而加速客户端的访问。On为打开,即持久化连接,Off为关闭,即一次连接,一个请求,下一个请求要重新建立TCP连接。
KeepAlive On和KeepAlive Off对比
从上面的对比来看,如果服务器内存比较多,而且用户在连接服务器后,持续的进行很多操作,发出很多请求,那么建议KeepAlive On。
从配置文件中还会发现两个配置参数:MaxKeepAliveRequests为一个连接允许的最大请求数,即在建立一个连接后,没有超时(KeepAliveTimeout参数)的时间内,允许最大的请求数,这个一般设置为0,即无限制,不过建议在安全性很好的网站,或者内网设置为0,如果安全性不是很好,很容易被攻击(短时间内并发无数个请求,直到耗尽内存)。
StartServers是服务器启动时,服务器初始化的子进程数
ThreadsPerChild是每个子进程可以建立的线程数
ServerLimit是服务器可以创建最多的子进程数
ThreadLimit是每个进程允许建立最多线程数
MaxClients是IHS可以并行承担的最大请求数
MinSpareThreads和MaxSpareThreads是一个进程所设置的空闲线程的范围,如果请求到来时,已经在这个范围内,IHS会一边提供空闲线程处理请求,一边新建新的进程和线程,即MinSpareThreads和MaxSpareThreads起到一个缓冲的作用,不会让请求到来时,线程突然已经用完,需要等待新的进程和线程的创建
MaxRequestsPerChild设置的是每个子进程可处理的最大请求数
三、 参数配置
理解了上面的概念,就比较容易设置这些参数(最重要的内容)
1.MaxClients既然是IHS可以并行承担的最大请求数,那么就是配置参数的入口,假设系统平时并发的用户量上限为固定值,那么MaxClients的值就是该值。
2.StartServers是服务器初始化的子进程数,ThreadsPerChild是每个进程可以建立的线程数,那么StartServers*ThreadsPerChild是服务器初始化时的总的线程数,这个值必须大于等于MaxClients,才能满足用户并发请求数
3. MaxClients必须是ThreadsPerChild的整数倍(该设置应该不对Apache影响),否则IHS将会自动调节到一个相应值(可能是个非期望值)
4.如果KeepAlive打开,为KeepAlive on,那么一个用户连接服务器后的第一个请求便会占用一个服务线程,如果MaxClients个并发用户同时向服务器第一次发出请求,那么StartServers*ThreadsPerChild个线程是能够满足这些请求的,但是如果这些用户建立连接后,在KeepAliveTimeout范围内连续请求,那么就需要建立更多的子进程和线程,因此ThreadLimit和ServerLimit值与KeepAliveTimeout范围内连续用户的请求数关系密切,假设这么多并发用户每一个用户在KeepAliveTimeout范围内连续用户的请求数为20,那么ThreadLimit*ServerLimit的值就必须是StartServers*ThreadsPerChild值的20倍,ThreadLimit和ServerLimit的值分配时,不能让其中任一值设定的太大,另一个值设定的太小,因为这个关系是进程和线程的关系,多线程和多进程的结合,讲究的是平衡,因此这两个值的可以预先设置,然后在通过几轮loadrunner压力测试,找到让IHS比较稳定的ThreadLimit值和ServerLimit的值
四、 结合场景的实例
场景(各请求中没有对待时间):在项目中,在做loadrunner压力测试时,用户的并发量为1900,一轮测试间隔为半分钟,一轮测试中各请求之间没有等待时间。
根据场景设定参数:
1.假设该系统是内网,比较安全,所以采用keepAlive on,KeepAliveTimeout设定为16,MaxKeepAliveRequests设置为0(一般不建议)
2.根据keepAlive on和用户的并发量为1900,MaxClients设定为2000
3.根据上面的配置,StartServers设定为50,ThreadsPerChild设定为100,StartServers*ThreadsPerChild=5000>1900, MaxClients是ThreadsPerChild的20倍(整数倍)
4.一轮测试中各请求之间没有等待时间,估算KeepAliveTimeout(16)范围内,可能会产生20个请求,20*StartServers*ThreadsPerChild=20*50*100, ServerLimit设定为200,ThreadLimit设定为500
5.MinSpareThreads设定为25,MaxSpareThreads设定为200
6.MaxRequestsPerChild设置为0(为测试所设),即每个子进程可处理的最大请求数没有限制
最后,强烈推荐MaxRequestsPerChild不要设置为0,设置为非0,可以保护Apache进程免遭内存泄漏的影响,因为你不知道运行在Apache上的应用程式在什么时候会出错导致内存泄漏。
原创文章,转载请注明:转载自
http://www.whohelpme.com/blog/main/NO1.html