apache 配置文件中的 maxclients 设置是否准确?

apache 配置文件中的 maxclients 设置是否准确?

在 /etc/httpd/conf/httpd.conf 文件中,maxclients 参数设置为 10。

但是,我可以运行 20 个并发持久连接(在单独的 Chrome 标签上),而不会出现任何错误。

我正在使用 EventSource javascript 对象来创建持久连接。每个 Chrome 选项卡都有不同的持久连接,每秒从服务器接收一个递增的数字。

我还使用以下 PHP 命令显示每个 Chrome 选项卡上的服务器连接数:exec("netstat -an | grep :80 | wc -l");

奇怪的是,服务器连接数始终显示为“2”。该命令是否存在延迟,还是它将来自同一 IP 地址的多个连接视为一个连接?

我还使用 shell_exec(“free -m”)监视内存,结果显示,随着持久连接的添加,缓存大小略有减少,但还远远不够使用交换文件。

我正在使用 CentOS v. 6.10,64 位,2 GIG Ram,以及 Xeon E3 处理器(4 核;3.1 ghz)。

对于我来说,了解我的服务器可以运行的最大并发持久连接数的最佳方法是什么?


谢谢您的回复。我使用的是 Apache 2.4.39。httpd.conf 文件中没有 MaxRequestWorkers 参数。

以下是一些其他问题:

  1. 如果将 maxclients 参数设置为 10,为什么我可以在单独的 Chrome 标签页上运行 20 个并发持久连接(如我的原始帖子中所述)而不会出现任何错误?

  2. 我正在进行的测试(在单独的 Chrome 标签上并发持久连接)是否会在服务器上产生与网站从 20 个不同的 IP 地址运行相同的负载?

  3. 当我运行 20 个并发持久连接时,为什么以下“服务器连接”命令始终显示“2”:exec(“netstat -an | grep :80 | wc -l”)

这是我用来测试的代码:

<?php
if ($_GET['nCreateSocket']) {
    @DoCreateSocket();
    exit;
}

$sTemp = exec('uptime');
$asFields = explode("average: ", $sTemp);
$sData_ServerLoad = $asFields[1];

$nData_ServerConnections = exec("netstat -an | grep :80 | wc -l");

$sServerMemory = shell_exec("free -m");
$sServerMemory = preg_replace('!\s+!', ' ', $sServerMemory);

$asFields = explode("Mem: ", $sServerMemory);
$asFields = explode(" ",$asFields[1]);
$nData_Memory_Used = $asFields[1];
$nData_Memory_Free = $asFields[2];
$nData_Memory_Cached = $asFields[5];
?>
<html>
<body onLoad=DoLoad()>
<script>
var gobjEventSource, gobjSpanAutoTest, da

function DoLoad() {
    da = document.all
    gobjSpanAutoTest = da.idSpanAutoTest
    DoCreateEventSource()
}

function DoCreateEventSource() {
    gobjEventSource = new EventSource("betting2019_ServerTest.php?nCreateSocket=1");
    gobjEventSource.onmessage = function(event) {
        var sData = event.data
        gobjSpanAutoTest.innerHTML += sData + "<br>";
    };
    gobjEventSource.onerror = function(event) {
        gobjEventSource.close()
        alert("Connection Error")
    };
}
</script>

<?php
echo "nData_ServerConnections: $nData_ServerConnections";
echo "<br>sData_ServerLoad: $sData_ServerLoad";
echo "<br>nData_Memory_Used: $nData_Memory_Used";
echo "<br>nData_Memory_Free: $nData_Memory_Free";
echo "<br>nData_Memory_Cached: $nData_Memory_Cached";
?>
<br><br>
<span id=idSpanAutoTest></span>
</body>
</html>
<?php
function DoCreateSocket() {
    $gcnInactivitySeconds = 6000;
    $gnLastActivity = time();
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');
    sleep(1);

    echo "data: 13\n\n";
    ob_flush();
    flush();
    for ($nIndex = 0; $nIndex < 7200; $nIndex++) {
        echo "data: $nIndex\n\n";
        ob_flush();
        flush();
        sleep(1);
        if (time() - $gnLastActivity > $gcnInactivitySeconds) {
            break;
        }
    }
    exit();
}
?>

答案1

由于您似乎正在使用 PHP,我想说您在设置中没有使用多线程。

最好使用其他工具来检查服务器的实际限制。要监控服务器状态,您可以启用/服务器状态将此设置添加到您的配置并重新加载服务器:

<Location /server-status>
    SetHandler server-status
    Require local
</Location>

然后,您可以使用 apachectl fullstatus 从命令行检查服务器状态(您需要安装链接才能使其工作)。您也可以从浏览器检查 /server-status,但您需要限制对该 URL 的访问。

为了测试目的,您可以使用 Apache AB 来对服务器进行压力测试。此软件通常与 Apache 一起安装。在这里,我执行了一个测试,该测试发出 50000 个请求,并发率为 25。

ab  -c 25 -n 50000  http://localhost/

我设置了一个服务器最大客户数 5你可以看到服务器同时服务的客户数量上限为 5 个。注意以下行当前正在处理 5 个请求,0 个闲置工人

$ sudo apachectl fullstatus
                  Apache Server Status for localhost (via ::1)

   Server Version: Apache/2.4.6 (CentOS)
   Server MPM: prefork
   Server Built: Apr 24 2019 13:45:48
     ----------------------------------------------------------------------
   Current Time: Thursday, 23-May-2019 22:59:32 CEST
   Restart Time: Thursday, 23-May-2019 22:57:40 CEST
   Parent Server Config. Generation: 1
   Parent Server MPM Generation: 0
   Server uptime: 1 minute 51 seconds
   Server load: 2.48 0.96 0.44
   Total accesses: 720593 - Total Traffic: 3.5 GB
   CPU Usage: u50.17 s48.82 cu0 cs0 - 89.2% CPU load
   6490 requests/sec - 32.5 MB/second - 5.1 kB/request
   5 requests currently being processed, 0 idle workers

 LCWCC

   Scoreboard Key:
   "_" Waiting for Connection, "S" Starting up, "R" Reading Request,
   "W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
   "C" Closing connection, "L" Logging, "G" Gracefully finishing,
   "I" Idle cleanup of worker, "." Open slot with no current process

Srv PID   Acc             M CPU   SS Req Conn Child  Slot   Client VHost               Request
0-0 23945 1/141895/141895 C 19.52 0  0   5.1  709.76 709.76 ::1    maya.localdomain:80 GET / HTTP/1.0
1-0 23946 1/144708/144708 C 20.01 0  0   5.1  723.83 723.83 ::1    maya.localdomain:80 GET / HTTP/1.0                                                        
2-0 23947 0/146565/146565 W 20.04 0  0   0.0  733.12 733.12 ::1    maya.localdomain:80 GET /server-status HTTP/1.1                                                               
3-0 23948 1/141185/141185 C 19.50 0  0   5.1  706.21 706.21 ::1    maya.localdomain:80 GET / HTTP/1.0
4-0 23949 1/146240/146240 C 19.92 0  0   5.1  731.49 731.49 ::1    maya.localdomain:80 GET / HTTP/1.0

答案2

在 Apache 2.3.13 之前,MaxRequestWorkers 被称为 MaxClients。旧名称仍受支持。

限制为用户提供服务的进程数可防止服务器因 RAM 不足而进行交换。限制值的计算方法是将 Apache 进程的典型平均内存使用量除以您要分配给 Apache 的总内存百分比。

  1. 计算 MaxRequestWorkers (或 MaxClients)和 ServerLimit 配置变量的限制值,如下所示:

如果您的实例有超过 4 GB 的 RAM:

将 Apache 进程的平均 %MEM 值除以 90%。例如,假设平均 %MEM 值为 0.8%,则将 90% 除以 0.8%

0.9 / 0.008 = 112.5 将结果向下舍入为最接近的整数。在本例中,极限值为 112。

如果您的实例具有 4 GB 或更少的 RAM:

将 Apache 进程的平均 %MEM 值除以 80%。例如,假设平均 %MEM 值为 0.8%,则将 80% 除以 0.8%,结果为 100。

注意:这些值是在假设实例是专用 Web 服务器的情况下计算的。如果您在服务器上托管其他应用程序,请在计算之前从 90% 或 80% 中减去这些应用程序使用的总内存百分比。如果您在 RAM 为 4 GB 或更少的实例上运行除 Apache 之外的其他应用程序,性能可能会下降。

  1. 编辑实例的 httpd.conf 文件,更新 MaxClients(或 MaxRequestWorkers)和 ServerLimit 配置变量,然后保存更改。例如:

最大客户数 112

服务器限制 112

  1. 通过从终端会话运行服务命令来重新启动 Web 服务器:

服务 httpd 优雅

现在浏览器选项卡无法保证每个网站打开的进程数量,这可能是多线程的,如果您想计算进程数,请检查 ps 以了解进程,并检查 proc 文件系统以了解线程。

相关内容