正确实施和测试 Apache/NGINX 的资源限制

正确实施和测试 Apache/NGINX 的资源限制

我被分配了限制资源(最大内存使用量和 CPU 权重)的任务Apache2nginx根据使用情况统计,测试该限制。

对于资源限制,我选择了简单的方法——通过在自定义的受限切片中运行 apache2 和 nginx,通过 systemd 的资源控制来实现:

限制器切片

[Unit]
Description=Resource limiting test
Before=slices.target

[Slice]
CPUWeight=50
MemoryMax=800M

[Install]
WantedBy=multi-user.target

当然,还添加了Slice=limiter.sliceapache2 和 nginx 服务文件的选项。

现在,nginx 和 apache2 在有限的切片中正确启动(用 检查systemctl status limiter.slice):

● limiter.slice - Resource limiting test
   Loaded: loaded (/etc/systemd/system/limiter.slice; enabled; vendor preset: enabled)
   Active: active since Wed 2018-07-18 16:07:59 EEST; 3s ago
    Tasks: 58
   Memory: 8.1M (max: 800.0M)
      CPU: 82ms
   CGroup: /limiter.slice
           ├─apache2.service
           │ ├─1823 /usr/sbin/apache2 -k start
           │ ├─1841 /usr/sbin/apache2 -k start
           │ └─1843 /usr/sbin/apache2 -k start
           └─nginx.service
             ├─1805 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             ├─1808 nginx: worker process
             └─1811 nginx: worker process

我相信资源限制应该会起作用。但是,我无法访问任何使用率很高的 apache/nginx 服务器,因此我无法让 apache2/nginx 使用那么多 RAM。我的任务是展示当 Apache2/Nginx 开始使用这么多内存时会发生什么?实际的,确实需要那么多 RAM,他们确实希望我展示那些运行的 RAM 使用量几乎相同的 Web 服务器。您可以忽略 CPU 重量,因为这不是我的主要关注点。

所以,换句话说,我需要以某种方式增加/扩大这些 Web 服务器的 RAM 使用量。

  1. 我尝试限制其资源使用的方式是一种好的做法吗(通过 systemd 切片资源控制)?
  2. 如何增加 Apache 和 Nginx 网络服务器的内存使用量(大约 800M RAM,如果可能甚至更高)?

我的机器有 6G RAM,我可以使用 2-3G RAM 进行测试。
运行Linux Debian 9.4.
Apache2版本:
Server version: Apache/2.4.25 (Debian)
Nginx版本:
nginx version: nginx/1.10.3

笔记:Apache2 网络服务器是主要关注点,对 Nginx 进行同样的操作没有必要,这只是研究的额外收获。

我尝试过任何方法来对 RAM 使用情况进行基准测试,但都失败了。请记住,我是在普通工作站上执行此操作的,因此没有简单的方法可以在 Web 服务器上部署应用程序并自然地产生足够的流量以实现内存使用量的如此增加。

更新:我通过一直使用繁重的基准测试,设法让 apache + nginx 消耗高达 400-500MB 的 RAM ab。但是,我仍然无法测试它们是否能够达到指定的 800MB RAM 限制。任何建议都将不胜感激。

答案1

增加 Apache 资源利用率的一种方法是使用附加模块。PHP 被认为是增加内存需求的一种简单方法。

如果您不想使用附加模块,则可以通过例如发布(上传)大文件(取决于配置)或保持 HTTP 请求进行(未完成请求、代理模式下的客户端速度很慢,...)来增加内存。

测试通常不太容易,因为它需要额外的资源和测试客户端上特定于用例的脚本/工具。

答案2

如果您所做的只是通过静态内容提供 HTTP 请求,那么真正耗尽内存的唯一方法就是在测试期间增加连接的并发性。我不知道您的用例是什么,但如果您所做的只是增加内存使用量,那么您可能需要使用 mod_session 让 apache 在服务器端保存一些会话数据。这将增加服务器端的内存消耗/连接持续时间和数量。但是,这可能与您的实际使用情况不符。内存使用量实际上取决于服务器的使用方式以及整体解决方案的架构。测试中提供的内容是否与生产中提供的内容相匹配?如果不是,那么您将无法获得准确的结果,并且您的约束可能不适合您环境。要获得准确的结果,您需要测试现有解决方案的典型使用场景。如果有超过 1 台服务器,您需要考虑到可能会出现故障,然后部分流量将必须由剩余的服务器处理。除了让 Apache 消耗内存之外,你测试的目的到底是什么?我是一名软件测试员,所以我可以帮你,但我需要更多信息才能给你提供好的建议,告诉你应该做什么。

相关内容