Beanstalkd prot.c:710 in check_err: read(): 连接由对等方重置 - k8s 集群中的慢速套接字通信

Beanstalkd prot.c:710 in check_err: read(): Connection reset by peer - slow socket communication in k8s cluster

在我们的 kubernetes 集群中,我们有 3 个 BE 服务(托管在 GCP 上)。

我们有 1 个 Beanstalkd 服务实例和 1 个 ES 集群(3 个主机 pods、2 个数据 pods、2 个客户端 pods)。 每个 BE 应用程序都有自己的 Redis 实例和 Mysql 服务器。

现在我们建立了各种健康检查,我们经常看到(每天 5-10 次)连接速度问题。 在健康检查中,我们所做的就是连接到服务并检查这需要多长时间(通过 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。但主要是 Beanstalkd(最多 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 regulary 注意到这个错误:

/usr/bin/beanstalkd: prot.c:710 in check_err: read(): Connection reset by peer

但是对此进行搜索并没有真正为我们提供太多信息。

注意我认为非常相关,但我们使用 Rancher 2 来管理我们的集群。

首先我想知道 beanstalkd 错误是什么意思以及如何解决它

其次很想听听关于一般套接字超时/慢如狗屎问题的任何建议。

谢谢!

问题是我们将 pheanstalk(php lib 从 3.x 升级到版本 4)到新版本及其文档 is/was 不好。

以前接受的连接方法现在不再接受,但方法名称相同,只是它现在需要一个参数,但如果您不提供该参数,它不会给出任何错误。现在,如果您不提供该参数,您就会创建僵尸连接。所以我们正在建立僵尸连接,吞噬了整个集群中的所有套接字,使一切都停止了。