私の C++ アプリケーションは libsybdb.so sybase 共有ライブラリを使用して Sybase データベースに接続します。これを Solaris 10 Sparc OS で実行しています。つまり、私のアプリケーションは、ライブラリ libsybdb.so によって提供される API を使用して、sybase データベースでアクション (具体的には一括コピー) を実行します。C++ アプリケーションは入力ファイルを解析し、解析されたデータを bulkcopy を使用してデータベースにコピーします (これを行うための API は libsybdb.so によって提供されます)。
通常、一括コピーは数分以内に完了しますが、完了までに 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 が何度も呼び出されるのかを知りたいですか ??? また、バルク コピーが正常に機能している場合、call ti pollsys は最小、つまり約 300 コールです。
前もって感謝します。