在我们的kubernetes集群中,我们有3个be服务(托管在gcp上)。
我们有1个beanstalkd服务示例和1个es集群(3个主吊舱,2个数据吊舱,2个客户端吊舱)。每个be应用都有自己的redis示例和mysql服务器。
现在,我们建立了各种健康检查,我们定期看到(如5-10次一天)连接速度问题。在healthcheck中,我们所做的就是连接到服务并检查这需要多长时间(通过php),如果需要太长时间(或者根本没有连接),我们将发出一个标志。
我们看到的结果如下:
Test took 10.616209983826 sec at 2020-04-28 23:45:11.
Environment: production
Test took too long - more than 2 seconds.
Checked items and their timing:
pdo took 0.0043079853057861 seconds
beanstalkd took 10.036059141159 seconds
redis took 0.0028140544891357 seconds
ElasticSeearch took 0.57300901412964 seconds
有时是redis花了这么长时间,有时是es。但主要是豆茎(最多20秒!)。这是我们如何检查的代码示例:
$startbeanstalkd = microtime(true);
// connect to Beanstalkd
try {
$queue = new Beanstalk(
[
'host' => $config->beanstalkd->host,
'port' => $config->beanstalkd->port
]
);
$queue->connect();
} catch (\Exception $e) {
$testPassed = false;
$testResult['Beanstalkd']['status'] = false;
$testResult['Beanstalkd']['message'] = $e->getMessage();
$testResult['Beanstalkd']['connectionDetails'] = json_encode($config->beanstalkd);
}
if($testPassed) $queue->disconnect();
$beantime = microtime(true);
$timetrack['beanstalkd'] = $beantime - $startbeanstalkd;
我们经常从beanstalkd注意到这个错误:
/usr/bin/beanstalkd: prot.c:710 in check_err: read(): Connection reset by peer
但搜索这个并没有给我们多少信息。
注意:我认为这非常相关,但是我们使用Rancher2来管理集群。
首先我想知道beanstalkd错误是什么意思以及如何解决它
其次,我想听听关于插座超时/慢得像屎一样的问题的建议。
谢谢您!
1条答案
按热度按时间b09cbbtk1#
问题是我们将pheanstalk(php lib从3.x升级到veresion 4)升级到了一个新版本,而且他们的文档很糟糕。
以前接受的连接方法现在不再被接受,但方法名称是相同的,只是它现在需要一个参数,但如果不提供该参数,它不会给出任何错误。现在如果你不给出这个参数,你就创建了僵尸连接。因此,我们正在建立僵尸连接,吃掉整个集群中的所有套接字,从而停止一切。