1

PHP と MySQL の Web アプリケーションを開発しました。最近は減速の兆しを見せています。090516 で mysql-tuner を 12 日間のアップタイムで実行しました。

サーバーの仕様は次のとおりです。
- Linux CentOS 6
- 48 プロセッサ
- 64GB RAM

以下は、稼働時間が 12 日の 090516 からの mysql-tuner ログ出力です。

root@layer1 [~/mysqltuner]# perl mysqltuner.pl --outputfile /~/mysqltuner/result_mysqltuner.txt
String found where operator expected at mysqltuner.pl line 3096, near
        "get_wsrep_option 'gcache.mem_size'" (#1)
    (S syntax) The Perl lexer knows whether to expect a term or an operator.
    If it sees what it knows to be a term when it was expecting to see an
    operator, it gives you this warning.  Usually it indicates that an
    operator or delimiter was omitted, such as a semicolon.

        (Do you need to predeclare get_wsrep_option?)
Use of implicit split to @_ is deprecated at mysqltuner.pl line 3179 (#2)
    (D deprecated, W syntax) It makes a lot of work for the compiler when you
    clobber a subroutine's argument list, so it's better if you assign the results
    of a split() explicitly to an array (or list).

 >>  MySQLTuner 1.6.10 - Major Hayden <major@mhtx.net>
 >>  Bug reports, feature requests, and downloads at http://mysqltuner.com/
 >>  Run with '--help' for additional options and output filtering

[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.6.31-log
[OK] Operating on 64-bit architecture

-------- Storage Engine Statistics -----------------------------------------------------------------
[--] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MEMORY +MRG_MYISAM +MyISAM +PERFORMANCE_SCHEMA
[--] Data in MyISAM tables: 913M (Tables: 11)
[--] Data in InnoDB tables: 12M (Tables: 63)
[!!] Total fragmented tables: 11

-------- Security Recommendations ------------------------------------------------------------------
[OK] There are no anonymous accounts for any database users
[OK] All database users have passwords assigned
[!!] User 'munin@localhost' has user name as password.
[--] There are 605 basic passwords in the list.

-------- CVE Security Recommendations --------------------------------------------------------------
[OK] NO SECURITY CVE FOUND FOR YOUR VERSION
Argument "gcache.mem_size" isn't numeric in addition (+) at mysqltuner.pl line
        1965 (#3)
    (W numeric) The indicated string was fed as an argument to an operator
    that expected a numeric value instead.  If you're fortunate the message
    will identify which operator was so unfortunate.

Argument "gcache.mem_size" isn't numeric in addition (+) at mysqltuner.pl line
        1972 (#3)

-------- Performance Metrics -----------------------------------------------------------------------
[--] Up for: 12d 6h 21m 24s (2 q [0.000 qps], 1M conn, TX: 192B, RX: 240B)
[--] Reads / Writes: 100% / 0%
[--] Binary logging is disabled
[--] Physical Memory     : 62.8G
[--] Max MySQL memory    : 338.9M
[--] Other process memory: 505.0M
[--] Total buffers: 169.0M global + 1.1M per thread (151 max threads)
[--] P_S Max memory usage: 0B
Argument "*main::get_wsrep_option" isn't numeric in numeric ge (>=) at
        mysqltuner.pl line 285 (#3)
Argument "*main::get_wsrep_option" isn't numeric in numeric ge (>=) at
        mysqltuner.pl line 288 (#3)
Argument "*main::get_wsrep_option" isn't numeric in numeric ge (>=) at
        mysqltuner.pl line 291 (#3)
[--] Galera GCache Max memory usage: *main::get_wsrep_optionB
[OK] Maximum reached memory usage: 340.0M (0.53% of installed RAM)
[OK] Maximum possible memory usage: 338.9M (0.53% of installed RAM)
[OK] Overall possible memory usage with other process is compatible with memory available
[OK] Slow queries: 0% (0/2)
[!!] Highest connection usage: 100%  (152/151)
[OK] Aborted connections: 0.00%  (34/1098331)
[OK] Query cache is disabled by default due to mutex contention.
[OK] No Sort requiring temporary tables
[OK] No joins without indexes
[OK] No tmp tables created on disk
[OK] Thread cache hit rate: 98% (17K created / 1M connections)
[OK] Table cache hit rate: 100% (381 open / 0 opened)
[OK] Open file limit used: 2% (228/10K)
[!!] Table locks acquired immediately: 94%

-------- ThreadPool Metrics ------------------------------------------------------------------------
[--] ThreadPool stat is disabled.

-------- Performance schema ------------------------------------------------------------------------
[--] Performance schema is disabled.
[--] Memory used by P_S: 0B

-------- MyISAM Metrics ----------------------------------------------------------------------------
[OK] Key buffer used: 100.0% (8M used / 8M cache)
[!!] Key buffer size / total MyISAM indexes: 8.0M/147.7M
[!!] Read Key buffer hit rate: 87.6% (16M cached / 1M reads)
[!!] Write Key buffer hit rate: 56.8% (1M cached / 777K writes)

-------- AriaDB Metrics ----------------------------------------------------------------------------
[--] AriaDB is disabled.

-------- InnoDB Metrics ----------------------------------------------------------------------------
[--] InnoDB is enabled.
[OK] InnoDB buffer pool / data size: 128.0M/12.1M
[!!] InnoDB buffer pool <= 1G and innodb_buffer_pool_instances(!=1).
[!!] InnoDB Used buffer: 17.82% (1460 used/ 8192 total)
[OK] InnoDB Read buffer efficiency: 100.00% (290756388 hits/ 290757478 total)
[!!] InnoDB Write Log efficiency: 12.12% (3691 hits/ 30446 total)
[OK] InnoDB log waits: 0.00% (0 waits / 34137 writes)

-------- TokuDB Metrics ----------------------------------------------------------------------------
[--] TokuDB is disabled.

-------- Galera Metrics ----------------------------------------------------------------------------
[--] Galera is disabled.

-------- Replication Metrics -----------------------------------------------------------------------
[--] Galera Synchronous replication: NO
[--] No replication slave(s) for this server.
[--] This is a standalone server.

-------- Recommendations ---------------------------------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    Set up a Secure Password for user@host ( SET PASSWORD FOR 'user'@'SpecificDNSorIp' = PASSWORD('secure_password'); )
    Reduce or eliminate persistent connections to reduce connection usage
    Optimize queries and/or use InnoDB to reduce lock wait
Variables to adjust:
    max_connections (> 151)
    wait_timeout (< 28800)
    interactive_timeout (< 28800)
    key_buffer_size (> 147.7M)
    innodb_buffer_pool_instances (=1)

飛び出すことはほとんどありませんが、私は経験豊富な MySQL DBA ではないため、スタック コミュニティからアドバイスを求めています。my.cnf でどの設定を変更する必要があるか教えてください。また、PHPMYADMIN でテーブルをデフラグする必要がある場合は、営業時間外に行う必要がありますか。

つい最近まで Web アプリの速度が低下していることに気付きませんでしたが、最近、カーネルの更新後にサーバーを再起動しました。この記事の時点での稼働時間は 19 時間です。

**追加情報: ** Web アプリには、ユーザーがモバイル デバイスを使用してログインするフロントエンドと、オフィスの従業員が提出物 (フォーム) を管理してさまざまな部門に送信するバックエンドがあります。

これが必要な場合は、munin チャートでこれを更新できます。サーバーが大幅に過剰にプロビジョニングされていることは理解しています (つまり、必要以上に多くの RAM とプロセッサが搭載されていることを意味しますが、将来的には十分でないことを望んでいました)。私の質問は、効率を改善するために、(mysqltuner によって提案された、および/または phpmyadmin によって提案されたように) いくつかの my.cnf 設定を微調整することはできますか?

4

1 に答える 1

0

今後 10 年間で、MySQL が約 4 つ以上のプロセッサを効率的に使用するようにリファクタリングされる可能性は低いでしょう。そのため、プロビジョニングによって 44 個のプロセッサ コアが浪費されます。それは多すぎるようです。また、MySQL が 1GiB 未満のメモリを使用しているようです。

通常、MySQL は構築されたものであり、構築されたものではありません。つまり、MySQL ベースのアプリをスケーリングするほとんどの人は、データベースのミラーを使用してスケーリングを行っています。MariaDB の最新バージョンには、マルチマスター ミラーリング スキームがあります。

あなたが問題を抱えている唯一の明らかな領域は、接続チャーニングです。おそらく my.cnf ファイルを編集して、使用する同時接続数を増やす必要があります。

Web アプリで接続プールが使用されているかどうかを調査する必要があります。Web アプリがデータベースへの接続を確立するにはしばらく時間がかかります。Web 要求ごとに接続を再確立する場合、接続を開く操作がボトルネックになる可能性があります。あなたの統計は、1 日 24 時間×12 日間、1 秒あたり複数の新しい接続を示しています。ワークロードが 1 日 24 時間ずっと安定して分散していない限り、それは Web アプリが非常に高い新規接続率でピークに達していることを意味します。これが速度低下の原因である可能性があります。

使用している Web アプリケーション プラットフォームの種類については言及されていません。ほとんどのプラットフォームには、接続プーリング操作があります。ほとんどの Web アプリは、1 つまたは 2 つのセットの DBMS 資格情報 (ユーザー名) を使用してすべての Web アプリ操作を実行するため、プール内の接続を再利用できます。あなたの統計によると、データベースには 600 人以上の異なるユーザーがいます。これは、Web アプリとしてはかなりの量です。

また (これは直感に反します)、Web アプリのスレッドが多すぎると、パフォーマンスが低下することがあります。一度に多くの操作を実行しようとするよりも、スレッド数を制限し、Web サーバーがクライアントからの要求をキューに入れる方が、ユーザー エクスペリエンスに適している場合があります。最新のサーバーの TCP スタックでは、かなり深い SYN 要求のキューが許可されているため、キューイングは目立ちません。

これは、あなたが示した限られたデータに基づく意見です: あなたのボトルネックは MySQL ではありません。

于 2016-09-21T00:57:29.583 に答える