在具有多个并发客户端的 TDLib 中持续增长的本机内存 (Java JNI + SQLite 后端)
我们在一个长期运行的生产环境中运行 TDLib,该环境中有多个并发的 Telegram 帐户,它们都在一个 JVM 进程中。随着时间的推移,我们观察到本机内存使用量持续增长且呈线性增长,但没有稳定下来,最终导致系统内存耗尽。 我们正在尝试确定,这种行为是否在高多客户端负载下是预期的,或者表明 TDLib 或其 SQLite/本机组件存在内存保留问题。 ** 环境 ** TDLib 版本:1.8.64 集成:通过 Java JNI 使用 TDLib 本机库 运行时:Java 应用程序(GlassFish) 操作系统:Linux x86_64 设置:在一个 JVM 进程中有约 50 个独立的 TDLib 客户端,每个客户端代表一个不同的 Telegram 帐户(基于 SIM 的隔离) ** 配置 ** 每个 TDLib 客户端都初始化为: request.useMessageDatabase = true; request.useFileDatabase = true; request.useChatInfoDatabase = true; 每个帐户约有 400 个群组 所有客户端之间的聊天总数约为 20,000 条 聊天内容持续更新(吞吐量高) 进程运行时间长(几天) ** 问题 ** 随着时间推移,本机内存使用量持续增长,最终耗尽系统内存。 经过约 5 天: 总 RSS:约 29–30 GB Java 堆:约 8 GB 估计的本机内存:约 21–22 GB 内存增长是持续的且没有稳定下来。 ** 观察 ** 增长与消息活动相关(负载越高,增长速度越快) 在低活动期间没有内存减少 本机内存占据了增长的主导地位(不是 Java 堆) 系统级检查显示: 大量匿名映射(约 7.2 GB + 约 1.2 GB) 许多重复的约 64 MB 内存区域(约 130 个区块) 这些似乎是本机分配,而不是可归因于 Java 堆或明显的 DirectByteBuffers。 ** 预期行为 ** 在热身后,本机内存使用量在稳定负载下应保持稳定。 ** 实际行为 ** 本机内存随着时间的推移持续增长 没有在数天之后观察到平台期 最终导致系统内存耗尽 ** 问题 ** 在这种工作负载下,这种行为是预期的,还是表明: - 无限制的内部缓存 - SQLite 相关的内存保留 - 本机分配器行为 ** 问题 ** 在长时间运行的多客户端部署中,是否有任何建议的运行时或构建配置(TDLib 编译标志、分配器设置、SQLite 选项或 TDLib 参数)可以影响或限制本机内存使用?
内容来源: tdlib/td