0

私は (ほぼ) 専用のシステムを持っており、これをいくつかのデータベースに使用しています。私の問題: Java アプリケーションの実行が非常に遅く (タスクを完了するのに 2 ~ 3 日かかる)、その理由がわかりません。

システムは、Xubuntu 12.04.1 LTS、3.2.0-32-generic x86_64、mySQL 5.5.28、Phenom X2 550、16 GB RAM、Intel SSD 520 (高い IOPS で知られる SandForce プロセッサを使用) です。

まず、CPU 負荷が実際には 100% になることはありません。ほとんどの場合、htop の出力は次のようになります。

  1  : 63.9% sys: 12.9% low:  0.0%        Tasks: 99, 164 thr; 2 running
  2  : 18.5% sys: 21.2% low:  0.7%        Load average: 1.14 1.23 1.22
  Mem[|||||||||||||||||13490/16049MB]     Uptime: 1 day, 06:32:13
  Swp:8188M used:195M                     Time: 18:33:04

  PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
16168 micha      20   0 5163M 1595M  4500 S 75.0  9.9 11h36:10 java -jar ./build
16169 micha      20   0 5163M 1595M  4500 R 75.0  9.9 11h31:34 java -jar ./build
 5968 mysql      20   0 11.9G 10.7G  3992 S 31.0 68.4 13h21:10 /usr/sbin/mysqld
 6142 mysql      20   0 11.9G 10.7G  3992 S 31.0 68.4 10h44:50 /usr/sbin/mysqld

mysqld の CPU 使用率が Java よりも高い場合もありますが、両方のコアで 100% 近くになることはありません。

私が取り組んでいるデータベースはかなり大きく、合計 24 GB の InnoDB テーブルがあります。すべてのテーブルにはPRIMARYキーがありEXPLAIN、インデックスを正しく取得するためにも使用していました。Java ツールはかなり単純なことを行いますが、その量は膨大です。関連するテーブルには約 1,000 ~ 2,000 万行あり、Java アプリケーションはさらに多くのクエリを実行しています ( SELECTUPDATEおよびINSERT)。準備済みステートメントを使用しています。

これらは InnoDB の私の設定です:

mysql> show variables like 'innodb%'
    -> ;
+---------------------------------+------------------------+
| Variable_name                   | Value                  |
+---------------------------------+------------------------+
| innodb_adaptive_flushing        | ON                     |
| innodb_adaptive_hash_index      | ON                     |
| innodb_additional_mem_pool_size | 8388608                |
| innodb_autoextend_increment     | 8                      |
| innodb_autoinc_lock_mode        | 1                      |
| innodb_buffer_pool_instances    | 1                      |
| innodb_buffer_pool_size         | 10737418240            |
| innodb_change_buffering         | all                    |
| innodb_checksums                | ON                     |
| innodb_commit_concurrency       | 0                      |
| innodb_concurrency_tickets      | 500                    |
| innodb_data_file_path           | ibdata1:10M:autoextend |
| innodb_data_home_dir            |                        |
| innodb_doublewrite              | ON                     |
| innodb_fast_shutdown            | 1                      |
| innodb_file_format              | Antelope               |
| innodb_file_format_check        | ON                     |
| innodb_file_format_max          | Antelope               |
| innodb_file_per_table           | OFF                    |
| innodb_flush_log_at_trx_commit  | 0                      |
| innodb_flush_method             |                        |
| innodb_force_load_corrupted     | OFF                    |
| innodb_force_recovery           | 0                      |
| innodb_io_capacity              | 200                    |
| innodb_large_prefix             | OFF                    |
| innodb_lock_wait_timeout        | 50                     |
| innodb_locks_unsafe_for_binlog  | OFF                    |
| innodb_log_buffer_size          | 8388608                |
| innodb_log_file_size            | 5242880                |
| innodb_log_files_in_group       | 2                      |
| innodb_log_group_home_dir       | ./                     |
| innodb_max_dirty_pages_pct      | 75                     |
| innodb_max_purge_lag            | 0                      |
| innodb_mirrored_log_groups      | 1                      |
| innodb_old_blocks_pct           | 37                     |
| innodb_old_blocks_time          | 0                      |
| innodb_open_files               | 300                    |
| innodb_purge_batch_size         | 20                     |
| innodb_purge_threads            | 0                      |
| innodb_random_read_ahead        | OFF                    |
| innodb_read_ahead_threshold     | 56                     |
| innodb_read_io_threads          | 4                      |
| innodb_replication_delay        | 0                      |
| innodb_rollback_on_timeout      | OFF                    |
| innodb_rollback_segments        | 128                    |
| innodb_spin_wait_delay          | 6                      |
| innodb_stats_method             | nulls_equal            |
| innodb_stats_on_metadata        | ON                     |
| innodb_stats_sample_pages       | 8                      |
| innodb_strict_mode              | OFF                    |
| innodb_support_xa               | ON                     |
| innodb_sync_spin_loops          | 30                     |
| innodb_table_locks              | ON                     |
| innodb_thread_concurrency       | 0                      |
| innodb_thread_sleep_delay       | 10000                  |
| innodb_use_native_aio           | OFF                    |
| innodb_use_sys_malloc           | ON                     |
| innodb_version                  | 1.1.8                  |
| innodb_write_io_threads         | 4                      |
+---------------------------------+------------------------+
59 rows in set (0.01 sec)

最後に、iotop を見ると、ディスクの使用率は約 1% で推移しているため、mySQL はほとんどの場合、システム メモリ内/システム メモリでのみ動作し、ディスクをスラッシングしないと思います。これでRAMとSSDがボトルネックから除外され、CPUだけが残ると思います。

しかし、新しい CPU に投資する前に、その他の意見をお聞きしたいと思います。本当にCPUがボトルネック?はいの場合、使用率が 100% を大幅に下回っているのはなぜですか?

4

2 に答える 2

2

Javaコードの知識がないため(この回答は更新されます)、挿入/更新には次の構文があると推測しています:

   openConnection();    
   startTransaction  
   {  
       insertOneRow();  
        commit();  
   }  
   endTransaction();  
   closeConnection();  

さらに、ステートメントを一緒にバッチ処理していないので、バッチのサイズである データベースX/N回のみを呼び出すことも想像できます。X

私は3 秒以内に2 millionレコードをOracle (MySql であることは知っています) データベースに永続化できるので、CPU の問題ではありません。

于 2013-01-07T17:52:20.250 に答える
1

プロファイラーを使用してボトルネックを特定できるかもしれません。

私は NetBeans にバンドルされているものを使用していましたが、非常に役立つことがわかりました。

ここで詳細を確認できます: http://netbeans.org/kb/docs/java/profiler-intro.html

于 2013-01-07T17:56:25.310 に答える