设为首页 收藏本站
查看: 871|回复: 0

[经验分享] apache注解

[复制链接]

尚未签到

发表于 2018-11-25 13:26:19 | 显示全部楼层 |阅读模式
  Apache内存使用量可以使用下面命令:
  ps -U apache u|awk '{S+=$6} END {print S}'
  什么是apache的工作模式?
  个人理解:apache的工作模式就是apache在运行时候的内存分配,进程和线程的使用方式。举个例子:一台apache正在运行的服务器,如果有个用户访问这个apache,那么apache是启用一个进程来处理用户的请求呢?还是在已有的进程中启用一个线程来处理该用户的请求?这个选择就是apache的工作模式来确定的。如果指定了某个工作模式比如prefork模式,那么每个用户的请求就要启用一个进程来处理。
  apache有几种工作模式?怎么查看和修改apache的工作模式?
  apache的工作模式有:beos,event,worker,prefork,mpmt_os2。
  在linux(centos)下使用#http –l 命令可以查看当前使用的工作模式。也可以使用#apachectl -l命令。
  #http –l
  #apachectl –l
  看到的prefork.c,说明使用的prefork工作模式。
  可以在编译的时候使用#–with-mpm=prefork对应的工作模式名称来修改工作模式。
  beos工作模式(跟linux关系不大,或者暂时用不上)
  在Beos系统上的工作模式,使用一个单独的控制线程来创建和控制处理请求的工作线程。
  event工作模式(不太稳定,或者说暂时用不上)
  event模式由于把服务进程从链接中分离出来,在开启KeepAlive场合下相对worker模式能够承受的了更高的负载。event模式为worker开发的变种模式,配置以及指令与worker完全相同。不过event模式不能很好的支持https的访问,有时还会出现一系列的问题。
  worker工作模式(与php配合不好,或者说暂时用不上)
  worker模式由于使用线程来进行处理请求,所以能够处理海量请求,而系统资源的开销要小于基于进程的服务器。同时worker模式也使用了多进程,每个进程又有着多个线程,以获得基于进程服务器的稳定性。
  mpmt_os2工作模式(很少用,或者说暂时用不上)
  mpmt_os2是专门针对OS/2优化过的混合多进程多线程多路处理模块(MPM) 。
  prefork工作模式(本篇文章的主角,使用最多而且最稳定的工作模式)
  prefork工作模式是linux下apache安装时候的默认工作模式,是使用最普遍的工作模式。为了能够简单的明白他的工作原理,下面是一个假设:
  有一台正在运行的apache服务器,用户A访问该apache的时候apache建立一个新的进程1处理用户A的请求。
  这时又有一个用户B访问该apache,apache又建立一个新的进程2处理用户B的请求。
  后来又有用户C,D,E访问该apache,apache又建立三个进程3,4,5处理他们的请求。
  如果每当一个新用户访问该apache,apache再建立一个新的进程处理用户的请求,是不是太慢了呢?
  所以apache的prefork模式在apache第一次启动的时候就建立5个进程,等待用户的连接请求,有一个用户访问,就有一个进程处理他的请求。
  那么如果有5个用户同时访问apache,apache第一次建立的5个进程全部用光了,所以apache就再从新在建立5个进程,等待下一批用户的请求。
  prefork模式会根据服务器的硬件情况,设定apache最多只能同时建立256个进程。再多的请求就只能等待前面的进程处理完毕在进行处理。
  假设完毕!
  上面的假设就是prefork模式的工作原理。但是上面假设中具体的数字不是定死的,而是通过prefork模式的配置来设置的。下面是http.conf中的配置信息。
  KeepAlive 是否允许持续连接
  MaxKeepAliveRequests 允许的持续连接的最大数
  KeepAliveTimeout 持续连接在没有请求多少秒后切断
  StartServers 最初启动时启动多少个服务器进程
  MinSpareServers 空闲服务器进程的最小数
  MaxSpareServers 空闲服务器进程的最大数
  MaxRequestsPerChild 每个子进程处理的最大请求数
  prefork模式的几个重要的参数:
  名称  默认值  说明
  StartServers 5
  apache启动时候默认开始的进程数
  MinSpareServers 5
  最小的闲置进程数
  MaxSpareServers 10
  最大的闲置进程数
  ServerLimit 256
  最大的进程总数(参考,实际看MaxClients)
  MaxClients 256
  最大的进程总数
  MaxRequestsPerChild 4000
  每个进程处理的最多请求数
  StartServers:这个看了就明白了。
  MinSpareServers:举个例子就明白了。
  apache在没有用户访问时候有5个闲置的进程,如果有一个用户访问网站。则闲置的进程就只有4个,这个值小于MinSpareServers,所以apache就以第一秒1个进程,第二秒2个进程,第三秒4个进程的速度新建空闲进程。直到大于等于MinSpareServers个空闲进程才结束。
  MaxSpareServers:还是举个例子就明白了。
  apache在没有用户访问时候有5个闲置的进程,如果有5个用户同时访问网站。则闲置的进程就只有0个,这个值小于MinSpareServers,所以apache就以第一秒1个进程,第二秒2个进程,第三秒4个进程的速度新建空闲进程。直到大于等于MinSpareServers个空闲进程才结束。在这个例子中直到第三秒,一共生成1+2+4个进程才能满足大于等于MinSpareServers的要求。后来这5个用户访问完apache,访问结束,关闭浏览器。所以apache就有了5+7个空闲的进程。这时空闲的进程比较多,apache就开始关闭一些进程,直到满足小于MaxSpareServers个空闲进程才结束。如果该值小于MinSpareServers则apache默认将该值设置成MinSpareServers+1。
  ServerLimit:这个参数是控制apache的进程总数的,那为什么会有两个参数控制apache的进程总数呢?这个参数在apache1的时代是没有的,因为那个时候有个256M内存的服务器就很厉害了。后来apache2的时代到来,服务器的硬件也得到升级。很多服务器都是4G内存,还有很多比4G内存大的服务器出现。apache1的时代只有一个MaxClients参数控制进程总数就够了,而这个参数最大值是256定死了。但是到了apache2的时代必须调整ServerLimit值大于256才能使MaxClient支持大于256的值。
  MaxClients:apache最大的进程数。apache1的时代只有一个MaxClients参数控制进程总数就够了,而这个参数最大值是256定死了。但是到了apache2的时代必须调整ServerLimit值大于256才能使MaxClient支持大于256的值。
  MaxRequestsPerChild:举个例子就明白了。
  apache在没有用户访问的时候有5个空闲进程。当一个用户访问网站,访问完又离开。则apache的第一个进程就处理了一个请求,从新进入闲置状态。再有一个用户访问网站,访问完后离开。则apache的第一个进程就处理了1+1个请求。这样继续访问3998个用户,这个进程就处理了4000个请求,之后就自动关闭这个进程。这个时候apache就只有4个限制的进程,小于MinSpareServers值所以apache从今建立一个空闲进程。至于为什么处理完4000个请求就要关闭这个进程呢?答案之一:为了防止内存的泄露。
  下面图文介绍这些参数(要深刻理解一个知识就要亲自去体验)
  测试环境参数 说明
  操作系统centos4.5(虚拟机) 服务器 apache2.2.6 内存1G
  测试文件index.php
  测试http.conf的prefork模式设置:(设置有点极端,但是可以很好的理解说明)
  首先查看apache第一次启动时候的空闲进程:
  linux(centos)下查看apache的进程可以使用#ps -ef|grep httpd命令,查看apache进程的内存使用情况可以使用#ps –U apache –u apache u命令
  #service httpd restrat:重启apache,初始化进程
  #ps -ef|grep httpd:用户名为apache的才是apache用于处理用户请求的进程
  #ps –U apache –u apache u:查看用户名为apache的进程(即apache为了处理用户请求而建立的进程详情)
  当前为没有任何用户访问时候apache建立StartServers=1个进程
  当有一个用户访问(通过本机上的ie浏览器访问虚拟主机上apache服务器模式该情景)
  可以看到apache的进程增加为2个,为什么呢?当唯一的空闲进程时候完之后,空闲进程小于MinSpareServers,apache就从新建立一个进程。注意查看RSS值(该进程的内存使用量KB)为4424的空闲进程。
  再看看访问完成之后的apache进程数。
  可以看到还是只有两个进程,而且这两个进程都是空闲的。
  当有两个用户访问(通过本机上的两个ie浏览访问虚拟主机上的apache服务器模拟该情景)
  可以看到有两个用户访问的时候apache的进程数增加为3个。为什么呢?当本来空闲2个进程时候完之后,空闲进程小于MinSpareServers,apache就从新建立一个进程。注意查看RSS值(该进程的内存使用量KB)为4424的空闲进程。
  再看看访问完成之后的apache进程数。
  可以看到空闲的进程数又减少为2个。为什么呢?当两个用户访问完成之后两个用户的进程都会关闭,这时候就会有3个空闲进程,这个值大于MaxSpareServers=2的值。所以apache会自动关掉一个进程满足MaxSpareServers=2的值。
  当有三个用户同时访问(通过本机上的三个ie浏览访问虚拟主机上的apache服务器模拟该情景)
  可以看到apache的进程有3个,而这三个进程都在处理用户的请求,没有多余的空闲进程产生。为什么呢?因为在上面我们设置了MaxClients的值为3。所以apache最多只会生成3个进程。
  再看看这三个用户访问完成之后的apache进程数。
  可以看到空闲的进程数又减少为2个。为什么呢?当三个用户访问完成之后三个用户的进程都会关闭,这时候就会有3个空闲进程,这个值大于MaxSpareServers=2的值。所以apache会自动关掉一个进程满足MaxSpareServers=2的值。
  当有四个用户同时访问(通过本机上的四个ie浏览访问虚拟主机上的apache服务器模拟该情景)
  可以看到虽然有四个用户同时访问,但是apache创建的进程数还是只有3个。就是说apache只对前面的3个用户请求进行了处理。第4个用户只能等待。
  这个时候查看apache的TCP连接情况。
  可以看到这4个用户都已经建立了连接。但是apache只处理了前面的3个请求。处理完3个请求在处理最后一个请求,这点可能从文件的打印内容看到。四个用户几乎是同时访问的。
  可以看到最后一个用户的请求时间是前面三个用户访问完成之后开始的。
  依次类推,当有7个用户同时访问时候又是什么样的?只贴几张图,看了就明白了。
  得出如下的结论:
  1,apache是严格按照prefork模式的配置参数来进程分配和管理的。
  2,MaxClients值就是apache的最大进程数。不像网上有些文章说的这个值越大越好(有的文章既然推荐该值为4000),您可以从上面的进程图中看到apache的每个进程的%MEM(内存占用百分比)值为0.5%左右。所以这个值的具体设置的最大数位:100/0.5 = 200。而这也只是在这个服务器只有一个apache的情况下。如果服务器有其他程序需要占用内存(比如mysql)这个值要小于200。你总不能把操作系统的所有内存都给apache吧?
  3,每个浏览器是一个用户,每个用户就是一条进程。明白意思了吧?我的这台服务器的并发量只有200。就是说我的这台服务器只能支持同时200个用户访问,再多的用户访问就只能是等待。或者说我这台服务器只支持200个浏览器的访问。关于服务器的并发我会在下面一片文章中详细讲解。
  4,200的并发量很小吗?要知道apache处理数据的速度是相当快的。一条正常的首页访问可能就一秒钟处理完毕。所以在假想的状态下,我的这台服务器,每分钟可以访问60*200=12000个用户。每天可以访问12000*60*24=17280000个用户的访问。这当然是在完全饱和的访问状态的假想数据。下一篇文章我会详细讲解网站并发,请求,连击等内容。
  5,如果访问的用户数大于MaxClients的数,多出的用户不会立刻断掉连接,还是会建立TCP连接。只不过会等待前面的用户处理完在得到相应。在php.ini,http.conf,操作系统设定的超时时间内得不到相应才会断掉连接。
  --------------------------------------------------------------
  二、
  在 默认状态下,Apache会分配最大256个并发客户端连接,或者256个进程(每一个都对应一个请求)。按照这种设置,一个流量巨大的网站会在顷刻间崩 溃(即使你假设每个进程占用5MB内存,那也需要1.3GB的内存来满足请求的数量)。如果不采取其它措施,系统会通过硬盘来尝试使用交换空间以处理它无 法在物理内存中完成的任务。
  所以,我们需要修改httpd.conf,使它使用最小的模块集
  修改httpd.conf文件,保留
  LoadModule authz_host_module modules/mod_authz_host.so
  LoadModule log_config_module modules/mod_log_config.so
  LoadModule expires_module modules/mod_expires.so
  LoadModule deflate_module modules/mod_deflate.so
  LoadModule headers_module modules/mod_headers.so
  LoadModule setenvif_module modules/mod_setenvif.so
  LoadModule mime_module modules/mod_mime.so
  LoadModule autoindex_module modules/mod_autoindex.so
  LoadModule dir_module modules/mod_dir.so
  LoadModule alias_module modules/mod_alias.so
  LoadModule rewrite_module modules/mod_rewrite.so
  LoadModule php5_module        modules/libphp5.so
  LoadModule fastcgi_module modules/mod_fastcgi.so
  我们配置的VPS服务器,系统加LAMP程序启动后总共在300M左右的内存,你可能希望要求50%的物理内存都供Apache使用,这样,你需要确定可以让httpd真正使用的内存数。
  首先准确计算出apache占用的进程数
  # ps -ef|grep httpd
  root     21678     1  0 Jul19 ?        00:00:00 /usr/local/apache//bin/httpd -k start
  vuser    21679 21678  0 Jul19 ?        00:00:00 /usr/local/apache//bin/httpd -k start
  vuser    21714 21678  0 Jul19 ?        00:00:07 /usr/local/apache//bin/httpd -k start
  vuser    21855 21678  0 Jul19 ?        00:00:07 /usr/local/apache//bin/httpd -k start
  看apache是以什么用户启动的,然后我们再用
  # ps -U vuser -u vuser u
  USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
  vuser    29838  0.0  0.0 200404  5580 ?        S    11:29   0:00 /usr/local/apache//bin/fcgi- -k start
  vuser    29845  0.0  0.0 879952  7592 ?        Sl   11:29   0:00 /usr/local/apache//bin/httpd -k start
  vuser    29851  0.0  0.0 879952  7592 ?        Sl   11:29   0:00 /usr/local/apache//bin/httpd -k start
  (注:一般是用# ps -U apache -u apache u察看,但我这里运行apache的是vuser用户)
  看到单个httpd进程使用了7.6  MB的RSS(驻留集大小)内存以及最大为88M左右的VSZ(虚拟内存),这当然在很大程度上取决于你在Apache里加载和运行的模块数量。这决不是 一个固定的数字。由于这个数字里还包含了共享库包,所以不是100%的准确。我们可以认为RSS数字的一半是httpd线程真正使用的内存数,这可能还有 点保守,但是离我们的目的已经非常接近了,这样,我们HTTPD线呈使用的内存数即为8M/2=4M
  说明:MinSpareservers和MaxSpareServers分别设置空闲子进程的最小和最大数量,StartServers设置了服务器启动时建立的子进程数量。
  ServerLimit 则是控制MaxClients所能使用的最大值。缩减MaxClients能让运行动态内容(比如:Drupal)的服务器有很大的改变。如果你的VPS 遭遇到流量的大幅增加,而你的MaxClients设置的太高的话,你的服务器将会无限循环工作于从物理内存交换页面到虚拟内存中,最终导致宕机。一般计 算适当的MaxClients值取决于你总共可用的系统内存除于每个Apache进程使用的内存。
  计算MaxClient
  MaxClients=(总内存-预留内存)/单个APACHE子进程使用的内存。
  那么我们的1GRAM的VPS服务器的MaxClient即为:
  MaxClients=(1024-512)/4=128个
  设置MaxRequestsPerChild
  MaxRequestsPerChild 设置的是每个子进程可以处理的请求数。每个子进程在处理了MaxRequestsPerChild个请求后将自动销毁。0意味着无限,即子进程永不销毁。 虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:
  1、可防止意外的内存卸漏;
  2、在服务器负载下降的时侯会自动减少子进程数。
  因此,可根据服务器的负载来调整这个值,如果非零的话,vps上个人认为1000左右是比较合适的。事实上这个值对Apache的性能影响不是很大。
  以下是本人在1G内存的VPS上常用的配置
  
  StartServers            5
  MinSpareServers        5
  MaxSpareServers       20
  ServerLimit        128
  MaxClients            128     MaxRequestsPerChild   1000
  
  备注:
  HostnameLookups 最好设置为off,否则会带来延迟,因为对每一个请求都需要作一次DNS查询。如果你使用了任何”Allow from domain”或”Deny  from  domain”指令(也就是domain使用的是主机名而不是IP地址),则代价是要进行两次DNS查询(一次正向和一次反向,以确认没有作假)。所以, 为了得到最高的性能,应该避免使用这些指令(不用域名而用IP地址也是可以的)。如果网站空间中没有使用 Options  FollowSymLinks,Apache就必须执行额外的系统调用以验证符号连接。为了避免这种情况应该在所有地方都设置 FollowSymLinks。如果设置AllowOverride  all,则Apache会试图对文件名的每一个组成部分都打开.htaccess,如无必要应该对文件系统中所有的地方都使用  AllowOverride  None。在Apache2.0能够忽略将要被发送的文件的内容的时候(比如发送静态内容),如果操作系统支持sendfile()  ,则Apache将使用内核提供的sendfile()来发送文件。使用sendfile可以通过免除分离的读和写操作来提升性能。我们可以通过设置 EnableSendfile on来开启它。
  优化KeepAlive
  KeepAlive允许你 的访问者在同一个TCP连接上完成多个请求,理论上它有助于提升反应时间,因为你的访问者可以在同一个连接上请求你的网页,图片和 javascripts。遗憾地是,Apache对于每个请求都需要一个工作进程去处理。默认的每个工作进程将持续打开15秒来处理每个请求,即使你的访 问者已经不再使用它了!这也就意味着你的系统在任何时间都是缺少工作进程的。我们都希望我们那只有有限资源的小VPS能有确实在工作的工作进程。实现的方 法之一是关闭KeepAlive。在你的httpd.conf文件中找到下面的一行:
  KeepAlive On
  然后将它改变为:
  KeepAlive Off
  如果你的网站有大量的图片和javascripts,通常最好还是让KeepAlive保持打开,然后做些调整。
  如果你决定让KeepAlive保持打开状态,改变默认的KeepAliveTimeout值就显得很重要了。它能避免连接没有在使用时仍然打开。在你的httpd.conf文件中找到下面一行:
  KeepAliveTimeout 15
  你只希望连接打开5秒钟,这已经足够用户打开大部分必须的文件。所以改变此行为:
  KeepAliveTimeout 5
  如果你希望让KeepAlive保持打开状态,同时应该增加MaxKeepAliveRequests。设置它为更大的值让每个连接可以处理更多的请求,从而增加效率。找到这行:
  MaxKeepAliveRequests 100
  改变为:
  MaxKeepAliveRequests 200
  调整Timeout
  另一个较小的调整是改变TimeOut指令,这个调整可以得到小的性能提升和减小DDOS***的效果。这个指令用于设置Apache当接收新请求,处理请求和返回响应前需等待多少秒。找到这行:
  Timeout 120
  改变为:
  Timeout 60
  ----------------------------------------------------------------
  三、
  我们假设每个httpd进程都在使用了27  MB内存。然后,你需要确定可以让httpd真正使用的内存数。根据运行在机器上的其他进程,你可能希望要求50%的物理内存都供Apache使用。在一 个装有1GB内存的系统上,就有512MB的内存可以被划分为多个27MB的内存,也就是大约19个并发的httpd内存。有些人坚持认为每个httpd   线程“真正”使用大约5MB的内存,所以从理论上讲你可以把512MB的内存划分出102个并发进程供Apache使用(要记住的是,除非你的网站需要极 其巨大的流量,否则这种情况是非常罕见的)。
  其他可以调整的项目包括KeepAlive、KeepAliveTimeout和MaxKeepAliveRequests等设置。可以放在httpd.conf文件里的推荐设置有:
  ServerLimit 128 MaxClients 128 KeepAlive On KeepAliveTimeout 2 MaxKeepAliveRequests 100
  通过将KeepAliveTimeout从15秒减到2秒,可以增加MaxClients命令;19太小,而128要好得多。通过减少进程存活的秒数,你可以在相同的时间内允许更多的连接。
  当然,如果没有真正的测试在背后支持,数字就是毫无意义的,这就是ab的作用之所在。使用ab对Apache配置文件(MaxClients等于  256、ServerLimit等于256、KeepAliveTimeout等于15)进行调整,使其能够满足1000个请求(100个连续请求并发产 生)的调整方法如下。(在执行测试的时候要确保服务器上有一个终端打开以观察系统的负载。)
  $ ab -n 1000 -c 100 -k http://yoursite.com/index.php
  现在把上面的服务器设置改为更加保守的设置,重新启动Apache,试着再次测试(总是从远程计算机上进行,而不是本机)。
  在这里的测试中,不同的设置导致执行所消耗的时间产生了一倍的差距(分别为27.8s和16.8s),但是负载的平均值为0.03和0.30。这可能会使 得你的网站变得稍慢,但是会确保它不会在高负载的情况下崩溃。还要记住的是,你将需要进行多次测试,以便取得一个平均值。
  使用ab是测试调整Apache配置的一个极佳方法,应该在你每次做出影响性能的更改时使用它。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-639433-1-1.html 上篇帖子: Linux主机下无报错安装Apache服务器 下篇帖子: apache+htpasswd
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表