在通过 DolphinDB 的各类 API 进行程序开发时,可能遭遇应用程序无响应(卡死)的情况。这类问题可能源于网络连接的意外中断、 DolphinDB 服务器端的状态异常、 API 库的内部处理逻辑,甚至是应用程序其他部分的资源争用。由于此类问题往往具有偶发性,且难以通过常规的日志输出定位根因,使得排查工作充满挑战。
Python API 是对 C++ API 的封装,如果通过上面的 py-spy 定位到是 Python API 调用内部,则需要进一步分析底层 C++ 部分。此时可以通过 pstack/gstack/GDB 等工具获取 C++ 部分的栈内容。具体方法可以查看C++API / ODBC 获取栈信息该节内容。因为 pstack/gstack/GDB 等工具是 Linux 专用工具,所以 Python API的 C++ 部分的栈信息在 Windows 上面无法获取。
通过 gstack 获取(注意:打印时会暂停目标进程以获取函数栈,完成之后进程恢复运行):
gstack pid
2.3. Java API / JDBC 获取栈信息
jstack 是 Java 虚拟机自带的一种堆栈跟踪工具,用于生成当前时刻的线程快照。线程快照是当前 Java 虚拟机内存中每一条线程正在执行的方法堆栈的集合。通过 jstack 命令可以获取运行中的 Java API / JDBC 的函数栈。jstack支持 Linux 和 Windows。
API 库内部处理逻辑问题:
场景描述:API 库本身可能存在 Bug,例如在特定条件下触发死循环、资源清理不当导致死锁、或内存管理异常。
表现:程序可能在执行某个特定 API 调用后卡死,或者在某些看似无关的操作后不定期卡死。
打栈价值:栈信息能揭示卡死是否发生在 API 库的内部函数中,而非网络等待或应用程序逻辑。例如,栈显示停在不含 I/O 操作的纯计算函数或同步原语上,则可能指向 API 库的内部缺陷。
与程序其他部分(非 DolphinDB API 相关代码)的交互问题:
场景描述:应用程序可能包含多线程、复杂的业务逻辑或使用了其他第三方库。这些部分可能与 DolphinDB API 的线程/资源交互产生冲突,例如共享资源的锁竞争、回调函数处理不当等。
表现:程序整体失去响应,但并非所有操作都涉及 DolphinDB 。
打栈价值:获取所有线程的栈信息至关重要。通过分析栈,可以识别出是哪个线程(DolphinDB API 的工作线程还是应用程序的其他线程)出了问题,以及问题的性质(如等待锁、执行耗时计算等)。这有助于将问题范围从 DolphinDB API 隔离出来,或确认其牵连性。
资源耗尽:
场景描述:客户端程序可能因内存泄漏、文件句柄耗尽、或线程数过多导致系统资源不足,进而引发卡死。
表现:程序运行一段时间后逐渐变慢直至卡死,可能伴随操作系统报警。
打栈价值:栈信息可以辅助判断卡死时的行为,但通常需要结合系统监控工具(如
top
,
htop
, 任务管理器)来确认资源使用情况。栈可能显示线程在等待资源(如内存分配)或处于无响应的状态。