過去数年間、ColdFusionでスケジュールされたタスクを実行すると、出力ログに次のメッセージがランダムに表示されます。
再帰が深すぎます。スタックがオーバーフローしました。
呼び出されているタスク内のコードはさまざまですが、この場合、データベースのカウンターをリセットし、成功したことを通知するメールを送信するだけの非常に単純なコードです。しかし、私はそれがあらゆる種類のコードで起こるのを見てきました、それで私はそれがこの問題を引き起こしているコードではないと確信しています。
呼び出されている他のコードをブロックするための空のapplication.cfm/cfcもあります。
これが表示されるのは、CFを再起動し、サービスが完全に開始される前にページを表示しようとしているときだけです。
エラーが発生することはめったにありませんが、実行されない場合に問題を引き起こすかなり重要なスケジュールされたタスクがいくつかあります。(したがって、私は助けのためにここに投稿しています)
メモリ使用量は問題ありません。直前に実行されたタスクは、80%を超える空きメモリを報告しました。夜間にメモリを監視しても、異常なスパイクは表示されません。マシンには4ギガのメモリがあり、OSとCF以外は何も実行されていません。最近、問題を解決するためにCFを再インストールしようとしましたが、役に立ちませんでした。他のいくつかのサーバーでも発生します。
これは内部サーバーであるため、午前3時の使用は存在しないはずです。その時点で実行されている他のスケジュールされたタスクはありません。
これは、CF7、CF8、およびCF9ボックス(完全にパッチが適用されている)で確認されています。
問題の現在のボックス情報:
- CFバージョン:9,0,1,274733
- エディション:エンタープライズ
- OS:Windows 2003 Server
- Javaバージョン:1.6.0_17
- 最小JVMヒープ:1024
- 最大JVMヒープ:1024
- 最小パーマサイズ:64m
- 最大パーマサイズ:384m
- サーバーメモリ:4GB
- CPU使用率が5%を超えることはめったにないクアッドコアマシン
JVM設定:
-server -Dsun.io.useCanonCaches = false -XX:PermSize = 64m -XX:MaxPermSize = 384m -XX:+ UseParallelGC -XX:+ AggressiveHeap -Dcoldfusion.rootDir = {application.home} /../ -Dcoldfusion.libPath = {application.home} /../lib -Doracle.jdbc.V8Compatible = true
これは、昨夜実行できなかったが、何年も実行されており、明日実行される可能性が最も高い、信じられないほど複雑なコードです。
<cfquery datasource="common_app">
update import_counters
set current_count = 0
</cfquery>
<cfmail subject="Counters reset" to="my@email.com" from="my@email.com"></cfmail>
私が何かを逃した場合は私に知らせてください。 ありがとうございました!