apache服务器的优化

apache服务器的最大并发数主要与服务器的CPU、内存、带宽、以及网站的一些服务如mysql等都有关系。

1、文件句柄

Linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can't open so many files”

这时你需要明白操作系统对可以打开的最大文件数的限制。

  • 进程限制

    • 执行 ulimit -n 输出 1024,说明对于一个进程而言最多只能打开1024个文件,所以你要采用此默认配置最多也就可以并发上千个TCP连接。

    • 临时修改:ulimit -n 1000000,但是这种临时修改只对当前登录用户目前的使用环境有效,系统重启或用户退出后就会失效。

    • 重启后失效的修改(不过我在CentOS 6.5下测试,重启后未发现失效):编辑 /etc/security/limits.conf 文件, 修改后内容为

      * soft nofile 1000000

      * hard nofile 1000000

    • 永久修改:编辑/etc/rc.local,在其后添加如下内容

      ulimit -SHn 1000000

  • 全局限制

    • 执行 cat /proc/sys/fs/file-nr 输出 9344 0 592026,分别为:1.已经分配的文件句柄数,2.已经分配但没有使用的文件句柄数,

    • 3.最大文件句柄数。但在kernel 2.6版本中第二项的值总为0,这并不是一个错误,它实际上意味着已经分配的文件描述符无一浪费的都已经被使用了 。

    • 我们可以把这个数值改大些,用 root 权限修改 /etc/sysctl.conf 文件:

      fs.file-max = 1000000

      net.ipv4.ip_conntrack_max = 1000000

      net.ipv4.netfilter.ip_conntrack_max = 1000000

    • 2、端口号范围限制?

      操作系统上端口号1024以下是系统保留的,从1024-65535是用户使用的。由于每个TCP连接都要占一个端口号,所以我们最多可以有60000多个并发连接。我想有这种错误思路朋友不在少数吧?(其中我过去就一直这么认为)

      我们来分析一下吧

      • 如何标识一个TCP连接:系统用一个4四元组来唯一标识一个TCP连接:{local ip, local port,remote ip,remote port}。好吧,我们拿出《UNIX网络编程:卷一》第四章中对accept的讲解来看看概念性的东西,第二个参数cliaddr代表了客户端的ip地址和端口号。而我们作为服务端实际只使用了bind时这一个端口,说明端口号65535并不是并发量的限制。

      • server最大tcp连接数:server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接为客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。


      • 3、带宽限制

      • 若带宽5M,每位用户访问速度每秒500K,则每秒十个并发,一分钟600个并发。

        4、内存限制

      • 查看当前的连接数可以用:

        ps aux | grep httpd | wc -l
        或:
        pgrep httpd|wc -l
      • 计算httpd占用内存的平均数:
        ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}'
      • 由于基本都是静态页面,CPU消耗很低,每进程占用内存也不算多,大约200K。服务器内存有2G,除去常规启动的服务大约需要500M(保守估计),还剩1.5G可用,那么理论上可以支持1.5*1024*1024*1024/200000 = 8053.06368
      • 5、mysql并发数限制


        mysql的连接设置为单例模式,这样可以保证,在不同页面访问数据库不用频繁的打开关闭数据库,有利于提高数据库效率。
      • 如果mysql 连接数据设置不合理可能会导致很小的流量mysql就提示MySQL: ERROR 1040: Too many connections错误了,那么要如何才算是合理设置mysql最大连接数呢,下面我来给大家介绍介绍。

        MySQL服务器的连接数并不是要达到最大的100%为好,还是要具体问题具体分析,下面就对MySQL服务器最大连接数的合理设置进行了详尽的分析,供您参考。

        我们经常会遇见“MySQL: ERROR 1040: Too many connections”的情况,通常,mysql的最大连接数默认是100, 最大可以达到16384。

        一种是访问量确实很高,MySQL服务器抗不住,这个时候就要考虑增加从服务器分散读压力,另外一种情况是MySQL配置文件中max_connections值过小:

        mysql> show variables like 'max_connections';
        +-----------------+-------+
        | Variable_name | Value |
        +-----------------+-------+
        | max_connections | 256 |
        +-----------------+-------+

        这台MySQL服务器最大连接数是256,然后查询一下服务器响应的最大连接数:

        mysql> show global status like 'Max_used_connections';

        MySQL服务器过去的最大连接数是245,没有达到服务器连接数上限256,应该没有出现1040错误,比较理想的设置是:

        Max_used_connections / max_connections * 100% ≈ 85%

        最大连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接上线就设置得过高了

      • 6、如何设置apache的并发数量

        1、在httpd.conf文件中修改

        #Server-pool management (MPM specific)

        #Include conf/extra/httpd-mpm.conf

        将上面一句的#注释去掉

        2、确定当前的apache是什么MPM模式(winnt模式,perfork模式,worker模式)

        进入到apache/bin目录

        cmd命令:httpd.exe -1

        20130922220427

        说明:看mpm_xxx.c 如果xxx是winnt  说明是winnt,另外还可能是perfork或者worker

        3、修改httpd-mpm.conf文件

        # WinNT MPM

        # ThreadsPerChild: constant number of worker threads in the server process

        # MaxRequestsPerChild: maximum  number of requests a server process serves

        <IfModule mpm_winnt_module>

        ThreadsPerChild      150  //修改这个值即可

        MaxRequestsPerChild    0

        </IfModule>

        4、重启apache,测试看看

        在Linux下,一般采用的MPM是perfork模式

        <IfModule mpm_prefork_module>

        StartServers          5        //预先起5个进程

        MinSpareServers       5       //最小空闲进程

        MaxSpareServers      10      //最大空闲进程

        MaxClients          150      //并发连接数

        MaxRequestsPerChild   0      //指一个进程里可以起多少个线程,对worker更好,0为不限制

        </IfModule>


      • 7、apache中MaxRequestsPerChild参数配置


      • MaxRequestsPerChild在apache中是一个非常重要的参数对于网站流量过大机器配置不好的朋友可以通过MaxRequestsPerChild来合理的设置进程与子进程的数量以达到最优的配置,下面一起来看看关于MaxRequestsPerChild参数配置的例子。

      • MaxRequestsPerChild参数介绍

        用 记事本打开apache2confhttpd.conf,

        通常在“Windows任务管理器-进程”中可以看到两个apache.exe进程,一个是父进程、一个是子进程,父进程接到访问请求 后,将请求交由子进程处理。

        MaxRequestsPerChild这个指令设定一个独立的子进程将能处理的请求数量。在处理 “MaxRequestsPerChild 数字”个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放,如果再有访问请求,父进程会重新产生子进程进行处理。

        如果 MaxRequestsPerChild缺省设为0(无限)或较大的数字(例如10000以上)可以使每个子进程处理更多的请求,不会因为不断终止、启动 子进程降低访问效率,但MaxRequestsPerChild设置为0时,如果占用了200~300M内存,即使负载下来时占用的内存也不会减少。

        内存 较大的服务器可以设置为0或较大的数字。内存较小的服务器不妨设置成30、50、100,以防内存溢出



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章