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 とスクレイパーのログ (キャッチされなかったすべての例外も含まれます) は空です。あなたはそれについてどう思いますか?