AWS 上的 PHP cURL 在长时间正常运行后开始返回错误 0

AWS 上的 PHP cURL 在长时间正常运行后开始返回错误 0

我们在 AWS 上使用 Ubuntu 16.04(4.4.0-1066-aws x86_64),使用 curl 从 PHP 应用程序向 Android 和 iOS 客户端发送推送。这是用于向 Firebase 发送推送的代码片段:

$ch[$i] = curl_init();
curl_setopt($ch[$i], CURLOPT_URL, LocalConfig::ANDROID_URL_REQUEST);
curl_setopt($ch[$i], CURLOPT_POST, true);
curl_setopt($ch[$i], CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch[$i], CURLOPT_POSTFIELDS, json_encode($fields));
curl_setopt($ch[$i], CURLOPT_CONNECTTIMEOUT, LocalConfig::CURLOPT_CONNECTTIMEOUT);
curl_setopt($ch[$i], CURLOPT_TIMEOUT, LocalConfig::CURLOPT_TIMEOUT);
curl_multi_add_handle($multiCurl, $ch[$i]);

它可以正常工作,但我的同事告诉我,过去 curl 有时会开始对大多数连接返回错误 0。但有些连接仍然成功。

他们提出的解决方案是关闭推送应用程序,重新启动网络服务,然后重新启动推送应用程序。

./cli/bash/stopAll.sh
sudo systemctl restart networking
./cli/bash/runAll.sh

如果仅仅重新启动应用程序,问题并没有消失,这意味着问题出在网络上。

当然,这意味着客户端会有一些停机时间,包括响应时间,这可以通过自动化程序来尽量减少,但理想情况下,我们希望从一开始就不要看到错误。

更多信息:

  • curl 正在访问这些 URL:“https://api.push.apple.com/3/device/“ 和 ”https://fcm.googleapis.com/fcm/send“;
  • 连接数峰值为 75,套接字数峰值约为 10k(大部分是 timewaits。孤儿在一秒钟内关闭),低于网络限制。几乎不使用带宽;
  • 平均负载低于0.25;
  • 5GB 磁盘和 2GB RAM 是免费的。也许太小了,但服务器只用于此目的,不用于其他目的;
  • 正常运行时间为数百天,问题每 2-3 个月发生一次。我们无法随意重现它;
  • 服务器现在已经安装了 netdata 和 atop,但是在上次事件之前没有配置监控,甚至 atop 也没有。

它是什么,我还应该查找什么,以及如何解决它?

相关内容