Memcache :: set()破了管道

时间:2010-09-15 01:47:52

标签: php memcached

一般来说,Memcache正在工作......但是我的日志中出现了很多这样的事情:

  

Memcache :: set()[memcache.set]:发送   错误的8192个字节,错误为errno = 32   破管

(字节数变化)

PHP5.3,Memcache类(v2.2.5 - 最新稳定版version

什么是破损的管道,它为什么会发生这么多,是否可以改进?

3 个答案:

答案 0 :(得分:1)

我一直在研究和阅读这个问题,并且听到了很多关于此的混淆。服务器端的Memcached选项上的文档非常少。我发现了一个隐藏的宝石,令人惊讶的是由MySQL托管。查看http://downloads.mysql.com/docs/mysql-memcached-en.pdf

有一些潜在的原因,有些人令人信服地说:

  • 操作系统级别的ulimit设置为阻止其他连接的某个级别
  • 连接数已达到最大值
  • 它只发生在高负荷时(对不起,但是呃!)

在大多数情况下,我无法理解或想象上述情况。对于我们的情况,事实证明当应用程序在自动模式之前运行时我们正在切换到二进制模式连接选项(在-vv详细模式中,我们说ascii写入)。一旦我们打开二进制选项,写入都会失败,从而导致管道损坏。

对于最大连接后果,当您在远程登录时查看统计数据时可以检测到它们。寻找以下

STAT accepting_conns 1
STAT listen_disabled_num 0

如果listen disabled_num为0,那就好了。这意味着自memcached实例启动以来没有丢弃连接。

还尝试使用以下Memcached选项优化您的连接,至少在PHP中,我们使用以下内容:

$this->m = new Memcached();
$this->m->setOption(Memcached::OPT_TCP_NODELAY, true);
$this->m->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$this->m->setOption(Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY);

我只能说,尝试一些设置组合,在app端,memcached服务器端并更改app上的其他默认设置(例如memcached.ini文件上的memcached.sess_lock_wait,请参阅php -i|grep memcached更多信息)。

祝你好运!

答案 1 :(得分:0)

我有类似的情况但是对于getextendedstats()

Notice: Memcache::getextendedstats(): send of 9 bytes failed with errno=32 Broken pipe in /usr/local/zend/share/ZendFramework/library/Zend/Cache/Backend/Memcached.php on line 382

这是我认为合乎逻辑的意见。 http://unix.derkeiler.com/Newsgroups/comp.unix.programmer/2006-02/msg00348.html

我的假设是memcached没有正确配置或网络问题,但我在本地运行memcached所以不确定这里我有网络问题。

我会尝试解决问题并让你知道问题是什么。

答案 2 :(得分:0)

一般来说,当我看到断管错误时,它是在极高的负载下。这是你的情况吗?有时简单的参数调整可以解决问题。如果你允许更多的连接而不是某些东西可以处理的东西,你经常会遇到管道错误。