1

1 つ以上のジョブを同時に (またはシステムの CPU の数によっては同時に) 実行するジョブ サーバーを作成しました。作成されたジョブの多くは、SQL Server データベースに接続し、クエリを実行し、結果をフェッチして、結果を CSV ファイルに書き込みます。これらのタイプのジョブではpyodbc、Microsoft SQL Server ODBC Driver 1.0 for Linux を使用して接続し、クエリを実行してから切断します。

各ジョブは、python multiprocessing モジュールを使用して個別のプロセスとして実行されます。ジョブ サーバー自体は、二重にフォークされたバックグラウンド プロセスとして開始されます。

今日、最初の SQL Server ジョブは正常に実行されたものの、2 番目のジョブがハングしているように見える (つまり、永久に実行されているように見える) ことに気付くまで、これはすべて正常に実行されていました。

さらに調査したところ、この 2 番目のジョブのプロセスがゾンビ化されていることに気付いたので、次のように手動でテストを実行しました。

[root@myserver jobserver]# python

Python 2.6.6 (r266:84292, Dec  7 2011, 20:48:22) 

[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

import pyodbc

conn = pyodbc.connect('DRIVER={SQL Server Native Client 11.0};SERVER=MY-DATABASE-SERVER;DATABASE=MY-DATABASE;UID=MY-ID;PWD=MY-PASSWORD')

c = conn.cursor()

c.execute('select * from my_table')

<pyodbc.Cursor object at 0x1d373f0>

r = c.fetchall()

len(r)

19012

c.close()

conn.close()

conn = pyodbc.connect('DRIVER={SQL Server Native Client 11.0};SERVER=MY-DATABASE-SERVER;DATABASE=MY-DATABASE;UID=MY-ID;PWD=MY-PASSWORD')

Segmentation fault

ご覧のとおり、データベースへの最初の接続は正常に機能しますが、その後の接続試行はセグメンテーション エラーで失敗します。

なぜこれが起こり始めたのか、解決策を理解することはできません。今日まではすべて正常に機能しており、コードは変更されていません。

この問題に関するヘルプをいただければ幸いです。

4

3 に答える 3

1

この問題の背後にある根本的なメカニズムの詳細については詳しく説明できません。ただし、python の multiprocessing モジュールで Queue クラスを使用することによって問題が発生していたと言えます。このキューを正しく実装しているかどうかは未回答のままですが、各ジョブが完了した後、キューがサブプロセス (および基になるデータベース接続) を適切に終了していないようで、セグメンテーション違反が発生しました。

これを解決するために、私は独自のキューイング システムを実装しました。これは基本的に、リストに入れられた順序で実行される Process オブジェクトのリストでした。その後、すべてのプロセスが完了するまで、ループによってこれらのプロセスのステータスが定期的にチェックされました。次に、ジョブの次のバッチが取得され、実行されます。

于 2012-09-17T11:52:13.177 に答える
1

私は非常によく似た問題を抱えていました。私の場合、解決策は、接続しようとしていたマシンの ODBC ドライバーをアップグレードすることでした。なぜそれが問題を解決したのか、私はあまり知りません。接続しようとしていたデータベース サーバーで何かが変更またはアップグレードされた可能性があります。

この回答はOPには遅すぎるかもしれませんが、問題のトラブルシューティング中にこの質問を見つけ、回答が表示されなかったときに少し落胆したため、とにかく共有したかった.

于 2012-09-06T00:19:11.857 に答える
0

私も最近この問題に遭遇しました。私の構成には、unixODBC-2.3.0 と Linux 用の MS ODBC Driver 1.0 が含まれています。いくつかの実験の後、データベースのアップグレード (この場合は SQLServer 2008 SP1 へ) が原因で問題が発生し、MS ODBC ドライバーにいくつかのバグが発生する可能性があると推測しています。この問題は、次のスレッドでも発生します。

http://social.technet.microsoft.com/Forums/sqlserver/en-US/23fafa84-d333-45ac-8bd0-4b76151e8bcc/sql-server-driver-for-linux-causes-segmentation-fault?forum=sqldataaccess

また、ドライバー マネージャーを unixODBC-2.3.2 にアップグレードしようとしましたが、うまくいきませんでした。私の最終的な解決策は、unixODBC-2.3.2 で FreeTDS 0.82.6+ を使用することです。このバージョンの FreeTDS ドライバーは、unixODBC-2.3.0 とうまく連携していません。これは、マネージャーが、ドライバーの機能がサポートされていないことについて不平を言い続けているためです。unixODBC をアップグレードすると、すべてがスムーズに進みます。

于 2014-03-19T11:25:11.883 に答える