1

我在使用 memcached 时遇到问题。不确定它是 memcached、php 还是 tcp 套接字,但每次我尝试对带有 memcached 的页面进行 50 或更多并发的基准测试时,其中一些请求使用 apache ab 失败。我收到 (99) 无法分配请求的地址错误。

当我对常规 phpinfo() 页面进行 5000 并发测试时。一切都很好。没有失败的请求。

似乎 memcached 不能支持高并发,还是我遗漏了什么?我正在使用 -c 5000 标志运行 memcached。


服务器:(2) 四核 Xeon 2.5Ghz,64GB 内存,4TB Raid 10,64 位 OpenSUSE 11.1

4

4 回答 4

5

好的,我已经想通了。也许这会帮助其他有同样问题的人。

似乎问题可能是多种因素的组合。

  1. 将 lighttpd.conf 中的 sever.max-worker 设置为更大的数字 原始:16 现在:32

  2. 在 lighttpd.conf 中关闭了 keep-alive,它使连接保持打开的时间过长。server.max-keep-alive-requests = 0

  3. 将 ulimit -n 打开文件更改为更高的数字。ulimit -n 65535

  4. 如果你在 linux 上使用: server.event-handler = "linux-sysepoll" server.network-backend = "linux-sendfile"

  5. 增加 max-fds server.max-fds = 2048

  6. 在回收之前降低 tcp TIME_WAIT,这样可以更快地关闭连接。在 /etc/sysctl.conf 添加: net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 3

    确保强制它重新加载:/sbin/sysctl -p


进行更改后,我的服务器现在运行 30,000 个并发连接和 1,000,000 个同时请求,没有任何问题、失败的请求或 apache ab 写入错误。

用于基准测试的命令:ab -n 1000000 -c 30000 http://localhost/test.php

我的 Apache 甚至无法接近这个基准。Lighttd 现在让我嘲笑 Apache。Apache 以大约 200 个并发爬行。

于 2009-08-14T23:21:32.427 回答
0

This is what I used for Nginx/php-fpm adding this lines in /etc/sysctl.conf @ Rackspace dedicate servers with Memcached/Couchbase/Puppet:

# Memcached fix

net.ipv4.ip_nonlocal_bind = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 3

I hope it helps.

于 2014-02-17T16:20:33.923 回答
0

我刚刚用一个文件测试了类似的东西;

$mc = memcache_connect('localhost', 11211);
$visitors = memcache_get($mc, 'visitors') + 1;
memcache_set($mc, 'visitors', $visitors, 0, 30);
echo $visitors;

在带有 nginx、php-fastcgi 和 memcached 的微型虚拟机上运行。

ab -c 250 -t 60 http://testserver/memcache.php从同一网络中的笔记本电脑上运行,没有看到任何错误。

你在哪里看到错误?在您的 php 错误日志中?

于 2009-08-14T21:07:36.363 回答
0

我只使用了一个 4 字节整数,将其用作页面计数器以进行测试。即使有 5,000 个并发连接和 100,000 个请求,其他 php 页面也能正常工作。这个服务器有很多马力和内存,所以我知道这不是问题。

似乎死掉的页面只有 5 行代码来使用 memcached 测试页面计数器。建立连接会给我这个错误:(99)无法分配请求的地址。

  • 这个问题从 50 个并发连接开始出现。
  • 我正在使用 -c 5000 运行 memcached 以实现 5000 并发。
  • 一切都在一台机器上(本地主机)
  • 唯一运行的进程是 SSH、Lighttpd、PHP 和 Memcached
  • 没有用户连接到这个盒子(测试机)
  • Linux -nofile 设置为 32000

这就是我现在所拥有的一切,当我发现更多信息时,我会发布更多信息。好像有很多人有这个问题。

于 2009-08-14T20:01:00.490 回答