Python应用程序使用谷歌pubsub被linux内核杀死,内存不足



我使用pub/sub将日志从物联网设备发布到云,并通过云功能存储在云日志中。这一直很好,但现在我遇到了一些问题,消息没有被传递,最终应用程序被终止。这是错误消息:

google.api_core.exceptions.RetryError: Deadline of 60.0s exceeded while calling functools.partial(<function _wrap_unary_errors.<locals>.error_remapped_callable at 0x7487bd20>, topic: "projects/projectid/topics/iot_device_logs"
messages {
data: "20210612T04:09:22.116Z - ERROR - Failed to create objects on main "
attributes {
key: "device_num_id"
value: "devincenumid"
}
attributes {
key: "logger_name"
value: "iotXX"
}
}
, metadata=[('x-goog-request-params', 'topic=projects/projectid/topics/iot_device_logs'), ('x-goog-api-client', 'gl-python/3.7.3 grpc/1.33.2 gax/1.23.0 gccl/2.5.0')]), last exception: 503 Transport closed
20210612T04:21:08.211Z - INFO - QueryDevice object created
20210612T04:38:30.880Z - DEBUG - Analyzer failure counts
20210612T04:42:40.760Z - INFO - Attempting to query device 
20210612T04:48:05.126Z - DEBUG - Attempting to publish 'info' log on iotXX
bash: line 1:   609 Killed                  python3.7 path/to/file.py

有问题的代码是这样的:

def get_callback(self, f, log):
def callback(f):
try:
self.debug(f"Successfully published log: {f.result()}")
except Exception as e:
self.debug(f"Failed to publish log: {e}")
return callback
def publish_log(self, log, severity):
# data must be in bytestring
data = log.encode("utf-8")
try:
self.debug(f"Attempting to publish '{severity}' log on {self.name}")
# add two attributes to distinguish the log once in the cloud
future = PUBLISHER.publish(
TOPIC_PATH, data=data, logger_name=self.name, device_num_id=self.deviceid)
futures[log] = future  
# publish failures shall be handled in the callback function
future.add_done_callback(self.get_callback(future, log))
except Exception as e:
self.debug(f"Error on publish_log: {e}")

我相信这是在连接中断期间发生的,我可以理解它可能无法发送消息。但是,我不明白为什么应用程序会被终止。

到目前为止,我正在尝试更改重试设置,看看它是否有所改进。但我担心这个应用程序会继续被扼杀。

你知道如何确定它为什么被杀,而不是简单地不发送并继续吗?

我似乎发现了问题,但这并不是我所想的。我会发布一个答案,以防其他人被类似的问题弄糊涂,希望他们没有被误导。

在我的案例中,连接问题与我的应用程序被终止同时发生。但据我所知,这不是原因,pubsub或其重试设置与我的应用程序被杀无关。

我在内核日志上发现了一条更具描述性的消息,说应用程序被内存不足的收割者杀死了,因为它消耗了太多内存。

原来我的程序内存泄漏了。我没有正确处理pubsub发行商生成的期货,所以它们一直在累积并消耗内存。

最新更新