よしだのブログ

サブタイトルはありません。

【Lucene / Solr】G1GC か CMS か?

こんばんは!宿題が遅れてすいませんw 今日は、ちょっとポエムみたいになるので余り役に立たないかもしれませんが、G1GC とOSSコミュニティのお話です。

お約束の、この記事は、Solr Advent Calendar 19日目の記事です。

qiita.com

きっかけ

ツイッター某所で G1GC がインデックスを壊すことがあるというようなつぶやきを見かけたのがそもそもの始まりでした。 以下が張られていたリンクで、ElasticSearch 2.X のユーザーマニュアルの一部でして、内容は変更してはいけない設定について記載されたものです。

www.elastic.co

その中にガベージコレクションの設定についてのセクションが有り、以下のような記載があります。

  • デフォルト GC を変更するな (CMS、G1GC はインデックスを壊すことがある)
  • G1GC は素晴らしいがいまだに定期的にバグが見つかっている

結構強い表現で、なかなか衝撃を受けたのですが、これって Lucene をコアに使うSolr もかんけいあるんじゃね?と思い調査をはじめました。

先に結論、G1GC 自己責任でどうぞ

結論から言えば、コミュニティとしての統一見解はないそうです。G1GC をもう使ってもいいかもしれないけど自己責任でね、ということです。色々調べてみた内容を書くと以下の通りです。

Lucene Wiki

まず、Lucene wiki には Java / JVM のバグに関してページがあり、以下のように記載があります。(2015/1/9 #31 RovertMuir) どのような状況下でも Lucene を G1GC で走らせるな、と結構強い口調で書かれています。ちょうど、最終更新時にこの一文が書き足されたようです。

Do not, under any circumstances, run Lucene with the G1 garbage collector. Lucene's test suite fails with the G1 garbage collector on a regular basis, including bugs that cause index corruption. https://wiki.apache.org/lucene-java/JavaBugs

開発者向けメーリングリスト

一方でメーリングリストでは、G1GC はだいぶこなれてきたので使ってもいいんじゃない?という投稿がされます。(2015/1/2 Shawn Heisey-2) 投稿者自身はG1GCを使っていて一度も問題に合ったことは無いと書いています。 一方で Mark Miller などは Aggerssive Option と呼んでおり、パフォーマンスとリスクを図りにかけ選択すべきと書いています。

I've been working with Oracle employees to find better GC tuning options.  The results are good enough to share with the community

Depending on your needs and risk tolerance, you might make a different choice. http://lucene.472066.n3.nabble.com/Garbage-Collection-tuning-G1-is-now-a-good-option-td4176927.html

某ニュースサイトの記事

また、全く別のJavaのニュースサイトの記事 (2015/1/26 jaxenter) では、G1GC と Lucene のこの辺の戦いの経緯が紹介されています。 (よく見ると、このエントリーを書いたのは lucene と solr の commiter である Uwe Schindler でした)

その中で、Oracle Java 8 update 40 のアナウンスで G1GC は production ready だと発表が合ったことや、最近の Lucene のビルドではこれらのエラーが見られなくなったと記載しています。 しかし一方で、かつて起こっていたエラーを理解している人が誰もおらず、ただエラーが出なくなっているだけであるとも記載しています。

When observing the Lucene builds during recent months, the Lucene team noticed that the errors initially seen no longer occurred. This is also consistent with the statement by Oracle that G1GC is “ready for production” in Java 8 Update 40.

However, one may still feeling bad when putting it into production, because some of the errors were never understood; they simply no longer occur – there is nothing more one knows about. https://jaxenter.com/java-9s-new-garbage-collector-whats-changing-whats-staying-118313.html

とどめに Lucene Solr Revolution 2016: Stump the Chump 2016 より

先日の Solr 勉強会に参加した際に Lucene Solr Revolution の Stump the Chump で喋っていたよー、という情報をキャッチし早速確認してみました。動画はご覧になれますので是非どうぞ。トップコミッター陣が経緯を含めてきちんと説明しております。

www.youtube.com

以下、喋っている内容のメモ書きです。

  • 31分ごろから39分ぐらいまで
  • Oracle が JDK 9 から G1GC をデフォルトにしようとしているがどう思いますか? Solr のデフォルトを G1GC にする予定は有りますか? solr を CMS / G1GC で使うメリットデメリットは有りますか?
    • bin/solr にはデフォルトの jdk も gc もコーディングしていないので、動かしている環境の設定が使われる
      • 正しくは、gc は CMS がデフォルトとしてコーディングされている (後に指摘が入る)
    • G1GC がダメかどうかも、pros / cons も分からないがテストはしっかりやるべき
    • G1GC でインデックスを壊すことが単体テストで確認されていた(今は直されている)
    • CMS でも同様に壊れるケースがあった
    • Mark Miller : 個人的な意見では 60GB 以上のような大きなヒープサイズでは g1gc は良いオプション、30GB 以下のヒープであれば CMS はよくテストされていて安定しているのでこれまでデフォルトにしてきたしおすすめしてきた。また、docValue の登場でそれほど大きなヒープサイズは必要としなくなったので、誰かが変えようとしない限り CMS のままだと思う。一方で、たくさん g1gc を使っているが特に問題は起きていないお客さんもたくさんいる。
    • java 8 でのパフォーマンス計測では g1 が良いという結果もでている
    • lucene の website (多分 lucene wiki のことだと思う) にあるコメントは g1 を使うなと書いてあるが、それはひどくクラッシュすることがあったので書かれたが、一人のコミッターが書いたのであってコミュニティの総意を示しているわけではない
    • 観客のコメント)5000台の solr を CMS から g1gc にスイッチしたが、リカバリーの原因になるような 15秒を超える gc の回数は確実に減った

Lucene Solr Revolution 2016 の初日なので 2016/10/13 のコミッターの発言です。この Stump the Chump というセッション自体が、お酒を飲みながらフランクにコミッターが質問にこたえるよ!というないようなので、適当なことを言っているのかと思いきや、結構ちゃんとしたことをいっているw

Java 8 Update 40 以降、G1GC 絡みのバグは減っているのか?

一応見てみたけど、よくわかりませんね。。

  • Oracle Java のほうは、database の検索の絞込が使えずわからない。
  • 参考で Open JDK については、多くないが Java 8 にも影響する G1 の問題がまだたくさんあることがわかる。

https://bugs.openjdk.java.net/browse/JDK-7178365?jql=project%20%3D%20JDK%20AND%20issuetype%20%3D%20Bug%20AND%20status%20in%20(Reopened%2C%20Open%2C%20%22In%20Progress%22%2C%20New)%20AND%20text%20~%20G1

調査のまとめ

まとめると、以下のような状況であることがわかりました。

  • ElasticSearch では、G1GC は使わずに CMS を使うべきとしている
  • Lucene/Solr については、統一的な見解を見つけることはできなかった。コミッターにより温度感はまちまちの模様。G1GC 使ってもいいかもしれないけど、テストしてからがいいんじゃね?とのこと。
  • OpenJDK には G1 に関するバグがまだたくさんあるが、Lucene にどのぐらい影響があるかはわからない

個人的には G1GC が原因でインデックスがロストした、という事象を聞いたことはないので、まあ、使ってもいいのかなと思ったりするのですが、使い方や設定、バージョンや Oracle なのか Open なのかによりけりな部分もかなり大きいのでテストしましょ、というのがやはり正解だと思います。Oracle Java 9 からはデフォルトで使用する、という熱の入れようなようなので、Java 9 で安定することに期待しつつ。