记一次python消费kafka进程持续消耗内存问题
前提:python写了一个kafka消费的脚本,脚本中消费kafka消息并将消费到的数据放在一个线程池中进行业务代码处理,使用supervisor管理这个脚本进程
遇到问题:这个进程占用的内存会越来越大,知道将机器内存消耗完
排查:网上找了一堆内存分析工具,好像都需要预埋代码,或者重新启动一个进程,全扯淡。
解决:读取kafka消息的代码添加一个计数器,没消费一个kafka消息加1,累计处理10000次请求,执行一次线程池重启和主动gc
import gc from concurrent.futures import ThreadPoolExecutor def process_message(args): pass def consume_kafka_data(topic): kafka_servers = [] consumer = KafkaConsumer(topic, bootstrap_servers=kafka_servers, auto_offset_reset='latest', enable_auto_commit=False) for message in consumer: yield message.value if __name__ == "__main__": topic = "" executor = ThreadPoolExecutor(max_workers=10) for value in consume_kafka_data(topic): try: args = json.loads(value.decode('utf-8')) executor.submit(process_message, args) if index > 100000: index = 0 logger.info("关闭线程池") executor.shutdown(wait=True) logger.info("gc 回收") gc.collect() logger.info("开启线程池") executor = ThreadPoolExecutor(max_workers=10) index += 1 except Exception as exception: logger.exception(exception)