(操作)
課題モジュールでファイルを提出する操作で、
ファイルアップロードUIから
ファイルピッカ -> ファイルをアップロードする -> 添付でローカルのファイルを選択 -> 「ファイルをアップロードする」ボタンを押下。
(現象)
添付ファイルのような画面で、グルグル回った状態のまま、応答がなくなります。
サーバがフリーズ状態になり、サーバの再起動が必要になる場合もあります。
Apacheのエラーログには以下が出力されました。
・mysqli::mysqli(): (HY000/2013): Lost connection to MySQL server at 'reading authorization packet'
・mysqli::mysqli(): (HY000/2013): Lost connection to MySQL server at 'sending authentication information'
・mysqli::close(): Couldn't fetch mysqli in /home/htdocs_wa1/moodle/lib/dml/mysqli_native_moodle_database.php on line 337
CentOS 5.5、メモリ:4G、HDD:500G(使用率約50%)
設定等
Moodle 2.3.1 (Build: 20120706)
[Apache 2.2.22]
・MaxClients = 256
[MySQL 5.1.61]
・max_connections = 500
[PHP 5.3.10]
・memory_limit = 512M
・upload_max_filesize = 512M
・post_max_size = 512M
チューニングを行うポイント/設定値など、ご教示頂けないでしょうか?
宜しくお願い致します。
土屋
追記事項です。
30~40ユーザ同時操作で各ユーザが約50kbのファイルをそれぞれアップロードでこのような現象となります。
10ユーザ程度ですと問題ありません。
MySQLのディレクティブ「connect_timeout (接続タイムアウト)」設定値を下記コマンドで確認された後、
mysql> show variables like '%timeout%';
my.cnf内に例えば下記のように追加されてはいかがでしょうか。
connect_timeout=30
参考資料:
[MySQL error 2013 - Stack Overflow]
http://stackoverflow.com/questions/766876/mysql-error-2013
(URL) http://php.net/manual/ja/ini.core.php
ここの post_max_size の記述には、
upload_max_filesize < post_max_size < memory_limit
と読める記述があります。「より大きく」と書いてあるので、そのまま読めば、等号なしの「<」の関係を満たさなければなりません。
お示しいただいた設定では、これらを全て512Mにしてあるので、ちょっと気になりました。
また、今回アップロードしているファイルは約50Kbとのことなので、この場合に限れば512Mは大き過ぎるように思います。
お世話になります。
ご教示頂き、ありがとうございます。
・my.cnf
connect_timeout = 30
・php.ini
memory_limit = 600M
post_max_size = 550M
upload_max_filesize = 512M
と設定を変更し、しばらく様子を見てみましたが、状況は改善されませんでした。
> また、今回アップロードしているファイルは約50Kbとのことなので、この場合に限れば512Mは大き過ぎるように思います。
他の操作で容量の大きいファイルをアップロードする場合があり、一先ず512Mと設定しております。
(実際に512Mという大容量のファイルをアップロードする事はありませんが)
大きすぎる分には特に問題ないと認識しております。
また、ご相談させて下さい。
ありがとうございました。
鹿児島大学医学部でMoodle2.9を使わせていただいています。
全く同じ症状に悩んでいます。
同時に学生120人が、講義の最後にレポートを課題モジュールでアップロードするのですが、
どんなにmysqlをチューニングしても、80名程度は成功するのですが、20名程度の学生がajaxのファイルアップロードのモジュールが表示されず、(車輪のようなアイコンがグルグル表示されます。)、アップロードできません。
特定の端末ではなく、ランダムに発生するようです。
ログインや小テスト等は特に問題なく利用できます。課題のアップロードのみ、毎回トラブルが発生します。
サーバ装置はCore i7-4790k,搭載メモリは64GByteです。
HDDはS-ATAの2TBと6TB(DB領域)です。
mysqlの設定は以下の通りで、テーブルは全てInnoDBとしています。(Moodle2.9ではInnoDB必須なので)
# * Fine Tuning
key_buffer_size = 1G
max_allowed_packet = 512M
thread_stack = 1M
thread_cache_size = 1024
myisam-recover = BACKUP
max_connections = 512
thread_cache = 512
table_cache = 512
thread_concurrency = 512
join_buffer_size = 10M
read_buffer_size = 10M
read_rnd_buffer_size = 100M
sort_buffer_size = 100M
table_open_cache = 512
interactive_timeout = 60
wait_timeout = 60
# * Query Cache Configuration
query_cache_limit = 256M
query_cache_size = 256M
# * Logging and Replication
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 3
expire_logs_days = 10
max_binlog_size = 100M
# * InnoDB
innodb_buffer_pool_size = 16G
innodb_additional_mem_pool_size = 512M
skip_innodb_doublewrite
skip-name_resolve
[mysqldump]
quick
quote-names
-------------
apacheの関係ありそうな設定
Timeout 300
KeepAlive On
#KeepAlive Off
MaxKeepAliveRequests 255
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 25
MaxClients 255
ServerLimit 256
MaxRequestsPerChild 30
</IfModule>
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 25
MaxClients 255
ServerLimit 255
MaxRequestsPerChild 30
</IfModule>
#
HostnameLookups Off
php.iniは、省略します。(必要であればリクエストしてください。)
シングルCPUで4コア8スレッドですが、DualCPUマシンを準備すべきか、悩んでいます。
InnoDBのパフォーマンスチューニングに関して、「skip_innodb_doublewrite」も記述されているようですね。
課題をアップロードできない時間帯のApacheエラーログの中に下記のようなエラーメッセージが記録されていませんでしょうか?
"Server reached MaxClients setting, consider raising the MaxClients setting"
上記エラーメッセージが記録されているようでしたら、Apacheのディレクティブ「MaxClients」および「ServerLimit」の設定値を現在よりも上げてください。
また、予算が許すようでしたら、「DualCPUマシンを準備」されても宜しいかと思います。
返信ありがとうございます。
Apacheのログでは異常なかったのですが、念のためMaxClientを512に増やしてみました。
DBのチューニングだけではどうも解決しなさそうな予感。
DBを格納しているストレージを高速に書き込めるタイプのSSDにしてみようかなぁ。(Write500M/s以上の)
DualCPUマシンは、最後の手段かなぁ。
あまりにもトラブルが多いので、ajaxの機能をOFFにして、従来のシンプルな課題アップロードができないかなぁとかも思い始めてます。
こんにちは。
ご提示されているApacheの設定は、workerとevent用のものですが、実際にApacheのmpmはpreforkではなくマルチスレッドのworkerで使用されているのでしょうか?
( httpd -V で動作中のMPMを確認できます)
もしworkerをお使いであれば、preforkに切り替えると安定したりしないでしょうか。
apachectl -Vで調べたら
Server MPM: Prefork
でした。
下記のように、「管理 > サイト管理 > アピアランス > AJAXおよびJavascript」ページで「Javaスクリプトをキャッシュする cachejs」を無効にされた方もいらっしゃるようですね。
[TinyMCE file picker in Moodle 2.5 is not loading - Stack Overflow]
http://stackoverflow.com/questions/17865139/tinymce-file-picker-in-moodle-2-5-is-not-loading
ありがとうございます。cachejsを無効にしてみました。
明日の朝、講義があるので、生徒に負荷テスト協力してもらいます。
結果をまた報告します。
cachejsを無効にしたら、旨く行きました。
120名が同時に課題ツールでアップロードできました。
AJAXのみのトラブルで、小テスト等では全くトラブルがなかったので、DBをチューニングしても解決しなかったわけです。
mysqlのログでも、apacheのログでも全くエラーはでてませんでしたし。(slow クエリログもでなかった)
ありがとうございました。
この件は、これで解決致しました。
1) WebサーバとMySQLサーバを分離する
2) DBサーバは、2CPUまたは4CPUのマシンにする。
ご提案のようにストレージを高速にする。
3) Webサーバは1CPUでよいがメモリは多めに搭載する
などの対策をしてデータベース処理時間を短縮することで、Apacheのプロセスのタイムアウトを軽減できるように思います。
また、Apacheはメモリなどのリソース消費量が多いので、nginx +PHP-FPMなどで運用しているところもあります。
参考になれば幸いです。
昔はDBを分離していましたが、64Bit化してからは一体化してました。
とりあえずcachejsを止めて、様子をみます。
ダメそうなら、まずはDB用のストレージを高速SSDに変えてみて、それでダメなら、サーバの分離も検討してみます。
ありがとうございました。
cachejsの停止で、解決しました。
ありがとうございました。