【发布时间】:2010-09-15 01:47:51
【问题描述】:
一般来说,Memcache 正在工作……但我的日志中出现了很多这样的情况:
Memcache::set() [memcache.set]: 发送 8192 字节失败,errno=32 断管
(字节数变化)
PHP5.3,Memcache 类(v2.2.5 - 最新稳定版version)
什么是坏管,为什么会发生这么多,能不能改善?
【问题讨论】:
一般来说,Memcache 正在工作……但我的日志中出现了很多这样的情况:
Memcache::set() [memcache.set]: 发送 8192 字节失败,errno=32 断管
(字节数变化)
PHP5.3,Memcache 类(v2.2.5 - 最新稳定版version)
什么是坏管,为什么会发生这么多,能不能改善?
【问题讨论】:
我已经对此进行了相当长的研究和阅读,并且对此感到很困惑。关于服务器端的 Memcached 选项的文档很少。我发现了一个隐藏的宝石,令人惊讶地由 MySQL 托管。看看http://downloads.mysql.com/docs/mysql-memcached-en.pdf
有几个潜在的原因,其中一些令人信服地引用:
对于大多数情况,我无法理解也无法想象上述情况是正确的。对于我们的案例,事实证明,当应用程序之前在自动模式下运行(在 -vv 详细模式下,我们说 ascii 写入)时,我们正在切换到二进制模式连接选项。一旦我们打开二进制选项,写入都会失败,从而导致管道损坏。
至于最大连接数的影响,当您 telnet 进入时查看统计信息时可以检测到它们。查找以下内容
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);
我只能说,在应用程序端、memcached 服务器端尝试一些设置组合并更改应用程序上的其他默认设置(例如 memcached.ini 文件中的 memcached.sess_lock_wait,请参阅php -i|grep memcached 了解更多信息)。
祝你好运!
【讨论】:
我有类似的情况,但对于 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 所以不确定这里有网络问题。
我会尽力解决问题并告诉你问题出在哪里。
【讨论】:
一般来说,当我看到 Broken Pipe 错误时,它是在极高负载期间。你的情况是这样吗?有时简单的参数调整可以解决问题。如果您允许的连接数超出了某物的处理能力,您通常会遇到管道损坏错误。
【讨论】: