我的 C++ 应用程序使用 libsybdb.so sybase 共享库连接到 Sybase 数据库。我在 Solaris 10 Sparc OS 中运行它。即我的应用程序使用库 libsybdb.so 提供的 API 在 sybase 数据库中执行操作(特别是批量复制)。C++ 应用程序解析输入文件并使用 bulkcopy 将解析后的数据复制到数据库中(为此,libsybdb.so 提供了 API)。
通常批量复制会在几分钟内完成,但有时需要 1 小时才能完成。当它很慢时,我拿了一个应用程序的 pstack。下面给出。
fd4ce294 pollsys (ffbcfbd8, 1, ffbcfb28, 0)
fd464b2c poll (ffbcfbd8, 1, 3e8, 10624c00, 0, 0) + 7c
fe699ce8 sybnet__complete_io (2d8c84, 3e8, 0, fffffffd, 0, 2d8c20) + 2a0
fe66bafc read_buffer (2d6d60, ffbcfca4, ffffd8f1, 0, fffffff6, fe7454c0) + 36c
fe669ec8 recvfill (2d6d60, ffbcfd04, 0, 0, 2d6850, 2d6d60) + 40
fe669e64 recvserver (2d6d60, 2d6d68, 1, 1, 0, 1) + 70
fe65a384 dbdoneinproc (2d6d60, 0, 0, 0, 1, 1) + 44
fe66447c dbsqlok (2d6d60, 2d54, f91cc, 0, 2d6d8c, 0) + 394
<<application code functions>>
Pstack 是在问题发生时以 1 分钟的固定间隔进行的。堆栈是一样的。
显示的所有方法(如 dbsqlok、sybnet__complete_io)都属于 libsybdb.so,除了 poll 和 pollsys(它们是系统调用),它们正在触发 pollsys 的执行,这被调用了数千次,这使得它变慢了。虽然最终解决了对 pollsys 的调用并且没有数据丢失,即加载成功。我想知道为什么它很慢,为什么 pollsys 被多次调用???此外,当批量复制工作正常时,调用 ti pollsys 最少,即大约 300 次调用。
提前致谢。