ログが大量に蓄積されると、CSVファイル書き出し時にFatal errorが発生し、書き出しに失敗する場合がある。
- 種別
- 不具合
- 機能
-
- ロギング
- 再現バージョン
-
- 3.5.0
- 3.5.1
- 3.5.2
- 3.5.3
- 3.5.4
- 3.5.5
- 3.7.0
- 3.7.1
- 3.7.2
- 3.7.3
- 3.7.4
- 3.7.5
- 4.0.0
- 4.0.1
- 4.0.2
- 4.0.3
- 4.2.0
- 4.2.1
- 4.2.2
- 4.2.3
- 4.2.4
- 4.2.5
- 4.2.6
- 4.6.0
- 4.6.1
- 4.6.2
- 4.6.3
- 4.10.0
- 4.10.1
- 4.10.2
- 4.10.3
- 5.0.0
- 5.0.1
- 5.0.2
- 5.5.0
- 5.5.1
- 5.9.0
- 5.9.1
- 5.9.2
- 5.15.0
- 5.15.1
- 5.15.2
- 6.0.0
- 6.0.1
- 6.0.2
- 6.0.3
- 改修バージョン
- 公開日
- 2012-12-17
- 更新日
- 2014-03-10
詳細
【発生条件】
- ロギングのログデータが大量に蓄積されている。
【準備】
- バージョン 3.5.0以降のガルーンでログが出力される操作を繰り返し、大量のログを出力します。
【再現手順】
- システム管理画面にログインし、[基本システムの管理] > [ロギング] > [ログの書き出し]の順にクリックします。
- 各項目を設定し、[書き出す]をクリックします。
→現象発生:
次のエラーが発生し、ログが途中までしか書き出されません。(エラーメッセージはCSVファイル内に書き出されます。)
-----------------
Fatal error: Allowed memory size of 838860800 bytes exhausted (tried to allocate 220 bytes) in /var/www/cgi-bin/cbgrn/code/include/fw/csv.csp on line 65
-----------------
補足:
- 次の環境で現象が発生することを確認しています。
-----------------
- マシンスペック
CPU:Intel(R) Xeon(R) CPU X5550 @ 2.67GHz
メモリ:2GB - データの状態
ロギングのレコード件数:400万件(約65万件書き出したところでFatal errorが発生します)
- マシンスペック
- お使いの環境によって、現象が発生するデータ件数は異なります。
- ログの書き出し処理以外の操作によって、同様のFatal errorが出力される場合があります。
回避/対応方法
【回避方法】
次のいずれかの方法、または2つの方法を併用して、ログをCSVファイルへ書き出します。
- php.iniのmemory_limitの設定を変更し、CSVファイルに書き出します。
- 「ログの書き出し」画面でログを書き出す期間を短く指定し、CSVファイルに書き出します。
php.iniのmemory_limitの設定を変更し、CSVファイルに書き出します。
例:
変更前
------------------------------
memory_limit = 800M
------------------------------
変更後
------------------------------
memory_limit = 900M
------------------------------
変更後(無制限)
------------------------------
memory_limit = -1
------------------------------
補足:
- php.iniは次のディレクトリーに配置されています。
(cgi実行ディレクトリ)/(インストール識別子)/php.ini - memory_limitの設定を800Mより大きく設定しても、サーバーのメモリが枯渇し、ログを最後まで書き出せない場合があります。ログが最後まで出力されていることを確認するまで、ガルーン側のログを削除しないで下さい。
- memory_limitの設定を変更することにより、同サーバー上の他のアプリケーションに影響を与える可能性があります。
- ログのCSVファイルへの書き出しはサーバーに負荷がかかります。サーバーへのアクセスが多い時間帯は、本操作を実行しないで下さい。
- ロギングの書き出し時のみ、本設定を行なってください。書き込みが完了したら、変更前の設定に戻して下さい。
- 設定変更後、Webサーバーを再起動する必要はありません。
- 次の環境で「memory_limit = -1」の設定でCSV書き出しを行なうと、約350万件書き出した時点でOut of memoryエラーとなり書き出しが中断することを確認しています。
-----------------
- マシンスペック
CPU:Intel(R) Xeon(R) CPU X5550 @ 2.67GHz
メモリ:2GB - データの状態
ロギングのレコード件数:400万件(約350万件書き出したところでOut of memoryエラーが発生します)
-----------------
- マシンスペック
「ログの書き出し」画面でログを書き出す期間を短く指定し、CSVファイルに書き出します。
- システム管理画面にログインし、[基本システムの管理] > [ロギング] > [ログの書き出し]の順にクリックします。
- 「書き出す期間」を設定し、[書き出す]をクリックします。
補足:
次の操作によって、ログがすべて書き出されているかどうかを確認できます。
- システム管理画面にログインし、[基本システムの管理] > [ロギング] > [ログ一覧] > [詳細検索]の順にクリックします。
- 次の条件でログを検索します。
例:
検索文字列:「(」 ※半角丸カッコ
検索期間:ログの書き出し時に指定した同じ期間 - 検索結果欄に表示される、先頭行のデータを確認します。
例:
2012-12-12 18:00:00 基本システム 重要情報 [login] system (id:6, name:'佐藤 昇', account:'sato') - 書き出したCSVファイルの最終行を確認し、手順3のデータと同じであることを確認します。
例:
2012-12-12 18:00:00 基本システム 重要情報 [login] system (id:6, name:'佐藤 昇', account:'sato')
------------------------------------------------------------
【更新履歴】
2014/03/10 「詳細」欄の補足を追記しました。