REST サービスで JavaMelody を実行していますが、最近、次のようなエラーでサーバーがクラッシュするという問題がありました。
Socket accept failed: java.net.SocketException: Too many open files
結局のところ、JavaMelody は /tmp/javamelody に何万ものファイルを作成しました。これを修正するにはどうすればよいですか。
REST サービスで JavaMelody を実行していますが、最近、次のようなエラーでサーバーがクラッシュするという問題がありました。
Socket accept failed: java.net.SocketException: Too many open files
結局のところ、JavaMelody は /tmp/javamelody に何万ものファイルを作成しました。これを修正するにはどうすればよいですか。
したがって、JavaMelody は、URL および SQL 要求ごとに固有の RRD ファイルを作成したことがわかります。私たちの REST サービスは何百ものエンドポイントを公開し、それぞれが何千もの値を取ることができます。
http://server/get/entity/10
ここで、10 はシステム内の任意の一意の ID です。そのため、クエリ対象のエンティティと同じ数の RRD ファイルがありました。
https://github.com/javamelody/javamelody/wiki/UserGuide#6-optional-parametersのドキュメントはhttp-transform-pattern
、 および と呼ばれるオプションを示唆していますsql-transform-pattern
。
パラメータ http-transform-pattern は、http リクエストの説明を変換し、これらのリクエストを集約できるようにするために動的部分 (オブジェクトの識別子など) を削除するための正規表現です。
同様に、パラメータ sql-transform-pattern は、これらのリクエストを集約できるようにするために、SQL リクエストの記述を変換するための正規表現です (たとえば、"in" 句のバインドされた識別子ではありません)。
これは、これらのオプションが何をするかについて非常に漠然とした説明であり、それらがどのように役立つかはすぐにはわかりません。しかし、同じ問題を抱えていた他の人は、これらの設定で問題が解決したことを示していたので、私はさらに深く掘り下げました.
これらのオプションがどのように機能するかは、正規表現に一致する URL の一部を「$」に置き換えることによるものと思われます。したがって、 に設定http-transform-pattern
する\d+
と、 URLhttp://server/get/entity/10
とhttp://server/get/entity/20
両方 の数字が正規表現に一致し、 URL に集約されますhttp://server/get/entity/$
。これにより、ID ごとに新しいファイルが作成されなくなるため、RRD ファイルの数が減少します。
この場合、後読みを使用して URL をグループ化しました。そのため、URL をバケットとに集約するhttp-transform-pattern
ように設定します。(?<=/server/get/fuzzballs).*|(?<=/server/get/foobars).*
http://server/get/fuzzballs$
/server/get/foobars$