0

このサーバーには十分なメモリがありますか?ある場合、またはない場合、どのように判断できますか? どのような変更をお勧めしますか?

仮想マシンの LAMP スタックのメモリをどのように管理する必要があるか、より具体的には、使用可能なメモリを最大化するように構成する方法について理解を深めたいと考えています。「もっと多くのメモリが必要です」、「innodbの使用をやめる」、「PHPを提供するためにfastcgiに切り替える必要がある」などの答えは探していません。スタックを変更せずに、サーバーに十分なメモリがあるかどうかを確認する方法と、そのパフォーマンスを調整する方法についての回答を探しています。経験則としては、スワップ サイズはシステム メモリと同じにする必要があります (これは単なる例であり、それが本当かどうかはわかりません)。

何が起こっているかについての背景情報をいくつか追加します。これに似たサーバーがクラッシュし始めました。次に、同じスタックを実行しているサーバーと、メモリを増やした Web アプリケーションが問題を解決しました。これは、より多くのメモリがあり、負荷を「処理」できるためであることはわかっていますが、基礎となるメカニズムを理解せずにやみくもにサーバーのサイズを大きくするのは、おそらく良い方法ではないと感じています. また、直感的に、512MB の Web サーバーはほぼすべてを処理する必要があると感じており、以前ははるかに少ないサーバーで実行していました。

130201 21:04:27  mysqld restarted
InnoDB: The log sequence number in ibdata files does not match
InnoDB: the log sequence number in the ib_logfiles!
130201 21:04:27  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
130201 21:04:28  InnoDB: Started; log sequence number 0 4945108
130201 21:04:28 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.0.77'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  Source distribution

Number of processes running now: 0
130201 21:08:48  mysqld restarted
InnoDB: Error: pthread_create returned 11
130201 21:08:57  mysqld ended

130201 21:26:19  mysqld started
130201 21:26:35  InnoDB: Error: cannot allocate 8404992 bytes of
InnoDB: memory with malloc! Total allocated memory
InnoDB: by InnoDB 8154720 bytes. Operating system errno: 12
InnoDB: Check if you should increase the swap file or
InnoDB: ulimits of your operating system.
InnoDB: On FreeBSD check you have compiled the OS with
InnoDB: a big enough maximum process size.
InnoDB: Note that in most 32-bit computers the process
InnoDB: memory space is limited to 2 GB or 4 GB.
InnoDB: We keep retrying the allocation for 60 seconds...
130201 21:26:58  mysqld ended

おそらくMySQLに十分なメモリがなかったため、またはInnoDBが占有しすぎてOSが機能し続けるのに十分ではなかったため、上記はクラッシュによるものであることがわかりました。以下は、アクティビティが少ない典型的なサーバーの 1 つです。これをどのように解釈すればよいか、私にはほとんどわかりません。例えば100MB無料でいいの?300m を超えるメモリを使用する apache スレッドが非常に多いのはなぜですか? それはどのように持続可能ですか? InnoDB バッファー プールはどのくらいにする必要がありますか? ヘルプやガイダンスをいただければ幸いです。

top - 01:56:34 up 3 days,  4:05,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:  74 total,   3 running,  71 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    524288k total,   424172k used,   100116k free,    11680k buffers
Swap:   499992k total,   102684k used,   397308k free,    56552k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                   
26702 apache    15   0  321m  46m 6068 S  0.0  9.1   0:59.08 httpd                                                      
26701 apache    15   0  316m  41m 6312 S  0.0  8.1   0:32.04 httpd                                                      
26705 apache    15   0  313m  30m 6292 S  0.0  5.9   0:31.81 httpd                                                      
26707 apache    15   0  311m  37m 6372 S  0.0  7.3   0:27.49 httpd                                                      
26704 apache    15   0  311m  23m 5820 S  0.0  4.6   0:28.30 httpd                                                      
20799 apache    15   0  310m  35m 6488 S  0.0  7.0   0:27.43 httpd                                                      
26703 apache    15   0  307m  32m 6240 S  0.0  6.4   0:27.78 httpd                                                      
11123 apache    15   0  307m  30m 5984 S  0.0  5.9   0:10.26 httpd                                                      
26410 apache    15   0  297m  21m 5704 S  0.0  4.3   0:17.26 httpd                                                      
 7871 apache    15   0  296m  23m 5616 S  0.0  4.6   0:09.18 httpd                                                      
26708 apache    15   0  296m  20m 5616 S  0.0  4.1   0:25.38 httpd                                                      
26706 apache    15   0  295m  22m 5636 S  0.0  4.4   0:25.78 httpd                                                      
 1332 root      18   0  279m 5452 3632 R  0.0  1.0   0:00.23 httpd                                                      
 1305 mysql     15   0  195m  10m 3836 S  0.0  2.0   0:26.57 mysqld                                                     
10551 root      17   0 99.7m 1196  900 S  0.0  0.2   0:00.00 crond                                                      
10595 root      17   0 99.7m 1196  900 S  0.0  0.2   0:00.00 crond                                                      
10651 root      17   0 99.7m 1196  900 S  0.0  0.2   0:00.00 crond                                                      
10695 root      17   0 99.7m 1196  900 S  0.0  0.2   0:00.00 crond                                                      
10481 root      16   0 91068 3284 2564 S  0.0  0.6   0:00.00 sshd                                                       
10485 assistrx  15   0 91068 1744  976 S  0.0  0.3   0:00.00 sshd                                                       
 5739 root      15   0 90144 3268 2556 S  0.0  0.6   0:00.00 sshd                                                       
 5741 assistrx  15   0 90144 1720  980 S  0.0  0.3   0:00.00 sshd                                                       
 9687 root      15   0 90144 3388 2652 R  0.0  0.6   0:00.01 sshd                                                       
 1340 root      15   0 74848  700  592 S  0.0  0.1   0:00.04 crond                                                      
 9690 root      15   0 66104 1600 1180 S  0.0  0.3   0:00.00 bash                                                       
 1132 root      18   0 65968 1176 1032 S  0.0  0.2   0:01.48 xe-daemon                                                                                       
4

2 に答える 2

4

MySQL DBのチューニングは困難な場合がありますが、実行可能です。RolandoMySQLDBAからのこの回答を確認してください。innodb_file_per_tableInnoDBバッファープールを測定する方法についての彼のアドバイスは完璧です。システムを詰まらせる1つの巨大なInnoDBクラッシュファイルに対処する必要があるまで、地獄がどのようなものかを実際に知らなかったので、私はオンにすることについてのアドバイスをお勧めします。次のクエリは、RolandoMySQLDBAの回答から直接得られます。

KBでinnodbバッファープールを作成する大きさを知るには、次のクエリを実行します。

SELECT SUM(data_length+index_length)/power(1024,1) IBPSize_KB
FROM information_schema.tables WHERE engine='InnoDB';

ここではMB単位です

SELECT SUM(data_length+index_length)/power(1024,2) IBPSize_MB
FROM information_schema.tables WHERE engine='InnoDB';

ここではGB単位です

SELECT SUM(data_length+index_length)/power(1024,3) IBPSize_GB
FROM information_schema.tables WHERE engine='InnoDB';

ここで説明tuning-primerするスクリプトも使用します。MySQLの頭痛の種を解決するのに本当に役立ちました。データを有効にするには、DBを少なくとも2日間稼働させてアクティブにする必要があるため、実稼働サーバーで少なくとも2日間のトラフィックが発生した後、これを運用サーバーで実行します。

于 2013-02-05T02:29:41.793 に答える
0

mysql のチューニングに入る前に、ulimits またはその他の OS 設定が原因でメモリ割り当てが失敗していないかどうかを確認する必要があります。

次のコマンドの出力を貼り付けてください -

  1. ulimit -a
  2. free -m

これらのコマンドは、OS に設定されているメモリ制限と物理メモリの仕様に関する情報を出力します。

于 2013-05-18T07:52:35.297 に答える