0

HTML スクレーパーに問題があります。Html-scraper は、HtmlUnit を使用して Java で記述されたマルチスレッド アプリケーションで、デフォルトでは 128 スレッドで実行されます。簡単に言うと、次のように動作します: 大きなテキスト ファイルからサイトの URL を取得し、URL に ping を実行し、アクセス可能であれば、サイトを解析し、特定の html ブロッ​​クを見つけ、html コードを含むすべての URL とブロック情報をデータベース内の対応するテーブルに保存し、次の場所に移動します。次のサイト。データベースは mysql 5.1 で、4 つの InnoDb テーブルと 4 つのビューがあります。テーブルには、テーブル結合で使用されるフィールドの数値インデックスがあります。また、CodeIgniter で記述された、解析されたデータを閲覧および検索するための Web インターフェイス (検索にはデルタ インデックス付きの Sphinx を使用します) もあります。

サーバー構成:

CPU: Type Xeon Quad Core X3440 2.53GHz
RAM: 4 GB
HDD: 1TB SATA
OS: Ubuntu Server 10.04

いくつかの mysql 設定:

key_buffer = 256M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 128
max_connections = 400
table_cache = 64
query_cache_limit = 2M
query_cache_size = 128M

次のオプションを除いて、デフォルトのパラメーターを使用して Java マシンを実行します。

-Xms1024m -Xmx1536m -XX:-UseGCOverheadLimit -XX:NewSize=500m -XX:MaxNewSize=500m -XX:SurvivorRatio=6 -XX:PermSize=128M -XX:MaxPermSize=128m -XX:ErrorFile=/var/log/java /hs_err_pid_%p.log

データベースが空の場合、スクレイパーは 1 秒間に 18 個の URL を処理し、十分に安定していました。しかし、2 つの弱点の後、urls テーブルに 384929 レコード (処理されたすべての URL の約 25%) が含まれ、8.2Gb を使用すると、Java アプリケーションの動作が非常に遅くなり、1 ~ 2 分ごとにクラッシュします。その理由は、増加する負荷を処理できないmysqlにあると思います(2+4*BLOCK_NUMBER処理されたURLごとにクエリを実行するパーサー、10分ごとにデルタインデックスを更新するスフィンクス、1人だけが使用するため、Webインターフェイスは考慮しません) 、おそらくインデックスの再構築が非常に遅いですか?しかし、mysql とスクレイパーのログ (キャッチされなかったすべての例外も含まれます) は空です。あなたはそれについてどう思いますか?

4

3 に答える 3

0

アドバイスをありがとうございました.mysqlが実際に問題の原因でした. my.conf でスロー クエリ ログを有効にすると、すべての反復を実行するクエリの 1 つが 300 を実行することがわかります (検索用の 1 つのフィールドがインデックス化されていません)。

于 2012-01-18T16:54:00.350 に答える
0

いくつかのステータスを確認するためだけに、次を実行することをお勧めします。その出力をここに置くことも役立ちます。

  1. dmesg
  2. topプロセスごとの常駐メモリと仮想メモリを確認する
于 2012-01-17T16:10:20.560 に答える
0

それで、アプリケーションは応答しなくなりますか? (クラッシュとはまったく同じではありません) すべてのリソースが空いていることを確認します。たとえばjstack、スレッドが拘束されているかどうかを確認するために a を実行します。

予想される接続数がある MySQL をチェックインします。Java で継続的に接続を作成し、それらをクリーンアップしないと、データベースの実行がますます遅くなります。

于 2012-01-18T08:28:35.403 に答える