JAVAのバグについて

By 杜若 桔梗 @ 2014-11-15 22:48

前回の投稿からずいぶんと間が開いてしまいました。桔梗です。

今回は珍しくLinux上でとあるソフトを動かしたときのお話です。

みんなも知っているSendmailというMTAがありますね。これの商用製品のアドオンという形で公開されている製品があるのですが、
この導入作業で遭遇したトラブルのお話です。
まあ、真犯人はバグだらけのJDK1.7系列ということなのですが、なかなか見つける手順というものは探してもないものですよね。
さっくりとお話をしますと、CoreDUMPが原因でフェイルオーバーするシステムがあると。原因はなんでしょうか、とう調査依頼です。
それならgdbで出力されたCoreをみてあげればいいわけです。コマンドライン上からは「gdb Coreを出力した実行ファイル Coreファイル」です。
その後に「thread apply all bt」と打つことですべてのスレッドをバックトレースすることができます。
これで、問題を起こしたスレッド、言い換えればCoreファイルを出力したスレッドの動きを追うことができます。
このときはメモリ周りのエラーでしたので重点的にGlibcやらLinux Kernel側を追っていました。今だからいえますが、これは思いっきり見当違いだったわけです。
真犯人は一番最初のスレッドにありました。ContinueInNewThreadだと?この後のスレッドはほとんどがsem_waitやら、pthread_cond_waitやら続いていました。
そこで、JDKのソースを探してみたところ・・・・・・

OpenJDK / jdk7u / jdk7u / hotspot/src/os/posix/launcher/java_md.cの1888行目以降を見てください。

ContinueInNewThread(int (JNICALL *continuation)(void *), jlong stack_size, void * args) {
int rslt;
#if defined(__linux__) || defined(_ALLBSD_SOURCE)
pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

if (stack_size > 0) {
pthread_attr_setstacksize(&attr, stack_size);
}

if (pthread_create(&tid, &attr, (void *(*)(void*))continuation, (void*)args) == 0) {
void * tmp;
pthread_join(tid, &tmp);
rslt = (int)(intptr_t)tmp;
} else {
/*
* Continue execution in current thread if for some reason (e.g. out of
* memory/LWP) a new thread can’t be created. This will likely fail
* later in continuation as JNI_CreateJavaVM needs to create quite a
* few new threads, anyway, just give it a try..
*/
rslt = continuation(args);
}

pthread_attr_destroy(&attr);

とありますね。pthread_join()のところで場合によってはデッドロックが発生しますよね、これ。
たしかこの問題はJAVA1.8(8)で解決されていたように思いますがいかがでしょうか。

詳しい解説はこれから。

1888行目からの処理ですが、
pthread_createで pthreadを起動して、pthread_join でpthreadの終了待ちをしています、
この pthread_join は、ブロッキング関数の為、pthread_create で起動した処理が終了しないと、
デッドロックにはまって、ContinueInNewThread が終了せず、pthreadのIDが、スタックの変数の為、メソッドの外から終了させることもできません。

このソースでは、ContinueInNewThread で作ったソースがタイムアウトで終了する事もなく、外から殺す事も出来ない為、引き渡した処理によってはデッドロックが発生する致命的なバグです。

私も私でよくこんなもん見つけたよね・・・・・・

もちろん、openSUSEにはopenJDKが導入されています。できるだけ、openJDK8を利用した方がいいと思います。

12月30日(火) コミックマーケット87に参加します。場所は 西い35a です。
配布物は、いつもの Geeko Magazine を拡大した Geeko Magazine を予定しています。openSUSE について、盛りだくさんで貴重な1冊にしたいと考えていますのでよろしくお願いします。

現段階では次のような内容を予定しています。

  •  特集: openSUSE で同人活動(原稿書きや入稿データ作成、お絵かきなど)
  •  小説
  •  openSUSE 女子部 (イケメン?)

詳細は決まり次第お知らせします

執筆者募集

今回の Geeko Magazine の発行への貢献者を募集しています。

記事の提供

  •  特集枠: 上記のお題に沿った記事を提供して下さい(特に音楽とか、誰か書きませんか?)
  •  ネタ枠: ちょっと見に行ってみようかなと思うような、ネタを募集しています
  •  自由枠: 他の人の記事の挿絵、イラスト、漫画、特集枠に入らない技術ネタ

当日のスタッフ

  •  コスプレ(と衣装)

貢献して頂いた方には、できあがった Geeko Magazine を進呈します。

応募方法: コメント、Twitter、opensuse-ug のメーリングリスト、Facebook など何かしらの方法でお知らせ下さい。
記事の最終締め切り: 11月30日(ネタ枠はできるだけ早い方が良い)
フォーマット: テキストと画像など
レイアウトや文章等の調整はこちらで行います。

Geeko Magazine が欲しい人募集

いつもの A4 1枚の Geeko Magazine とは異なり、ある程度の印刷代がかかる見込みです。多くの部数を作成すると、単価は安くはなります。(50部であれば500円程度)

そこで、どの程度需要があるかを調査するために、事前予約を受け付ける予定です。また会場・または関東エリアでは受け取れない人のために、各地方で欲しい人に頒布して頂ける方がいれば、ご協力をお願いします。

 

openSUSE.Asia Summit のレポートはもう少しお待ち下さい。

オープンソースカンファレンス 2014 Nagoya に出展しました。
日本openSUSEユーザ会が名古屋に出展するのは、今年で3度目ですね!

今回のセミナーのタイトルは、「秘伝!クラウドに開発環境をえいっと構築する方法」でした。
実はこのセミナー、どういうわけだか事前申込者数の数が非常に多く、非常にプレッシャーを感じてました^^;
これからクラウドを活用したい!と思ってる方はやはり多いのでしょうか。
(単にタイトルが「釣り」だったという噂もちらほら・・・?)

あれから武山さんからの指摘もいただきまして、セミナー資料も一部修正しています。
セミナーの内容は下記からご覧ください。

今年は出展ブース数が昨年ほど多くなかったのか、日本openSUSEユーザ会としても机まるまる一個分でしたが、
名古屋の会場の熱気はやはり相変わらずですね!
セミナー配布資料も100部全て配りきることができました。

OSC名古屋2014

また、今回から中国産「ちょっと大きな小ぎーこ」もお目見えしています。
(小笠原さんに寄贈していただきました。ありがとうございます!)

ライトニングトークでは、武山さんの「OSS に貢献しよう」もありましたね。
こちらも公開されてま~す!

今回 OSC名古屋にご来場された皆様、
ブース出展に協力いただいた、こばやしさん、武山さん、
OSC でいつも多大なるご迷惑(?)ばかりおかけしている、宮原さん、びぎねっとの皆様、
本当に有難うございました! この場を借りてお礼を申し上げます。

今後も、日本openSUSEユーザ会を宜しくお願いいたします!!!

OSC名古屋 2014:
2014/7/5

  • ビラ配布: 100枚 + 15枚?(←OSC浜名湖の余り分)

次回の OSC 出展は、 2014/8/1 ~ 2014/8/2 の OSC京都です。
オープンソースカンファレンス 2014 Kansai@Kyoto

オープンソースカンファレンス 2014 Hamanako に出展しました。

セミナー:

今回 OSC浜名湖2014 のセミナー枠トリとして登場させていただきました^^;
いろいろトラブルが発生しましたが、なんとか 発表自体は 15分にはおさまったはずです。。。

今回のセミナーは初級者でも気軽に Linux を使ってみよう!というコンセプトで資料を作りました。
中級者以上の方は物足りない内容かと思いますが^^; 興味がありましたらご覧ください。


ブース:

OSChamanako2014

浜松に特大ぎーこ初上陸! というわけで、会場の一番隅(?)にブースが設置されました。
(お隣は、東京エリア Debian 勉強会さん。)

来場された方々に話を聞くと、
「Linux は触ったことないけど、これから勉強してみたい」
「Linux は普段仕事で使用しているけど、openSUSE は使っていない」
「仕事で openSUSE も使ってます。デスクトップで使う分には最高の選択肢ですね!」
と、様々な声を聞くことができました。

これを機会に、ぜひ openSUSE を試していただきたいと感じています。
Linux は Ubuntu とか Redhat だけじゃないんだぞ~と^^


次回は:

次回は、7/5 のオープンソースカンファレンス Nagoya 2014 の出展を予定しています。
続けて東海地方となりますが、またまたよろしくお願いしま~す!

OSC京都 2013 に参加してきました!

By hashimom @ 2013-08-05 00:19

はしもとまさです。お久しぶりです(^^)

OSC京都へ参加してきましたので、その活動報告を致します。

2013-08-02 10.10.47

去年に引き続き、OSC京都は今年で2回目ですが、
今年の OSC京都は、これまでと異なり、
ブース出展には多くの方にご協力いただいたオープンソースカンファレンスとなりました。

この場を借りて、ご協力いただいた方にお礼申し上げます。
(これからもよろしくお願いしま~す!)

OSC京都は、京都が学生の街ということもあり、他の場所よりも学生さんが多い印象があります。
その中でも特に多かったのは、OSCボランティアで参加していた女子学生の方々に
「(ギーコの)ぬいぐるみがかわいい~」
と言ってもらえたことですね。

やはり、ギーコは openSUSE の魅力の1つだと思いますので、
今後ももうプッシュしていかないとダメのようです(笑)

さて、今回は急遽私がセミナーの担当となりました。
諸事情により準備から発表まで4日ほどしかなかったのですが、
何とか形になって、少しほっとしております。

以下の場所に発表時の資料をアップしました。
興味のある方は一読ください。

OSC京都 2013:
8/3(Fri)

  • ビラ配布: 35枚
  • DVD配布(32bit版インストールDVD): 12枚

8/4(Sat)

  • ビラ配布: 46枚
  • DVD配布(32bit版インストールDVD): 25枚

(個人的には土曜日にもうちょっと配りたかったですね^^;)

次回は、秋にOSC東京でしょうか。
私は行けるかまだわかりませんけどね^^;
今後も openSUSE をよろしくお願い致します。

OSC Tokyo 2013/Spring

By ftake @ 2013-02-28 01:40

先日の OSC 東京では、多くの方にブース・セミナーに来て頂き、ありがとうございました。今回は SUSE Studio の活用して、クラウドインフラで openSUSE を使う方法を中心に紹介しました。

セミナーの資料は SlideShare で公開しました:
クラウドインフラのゲストOSはopenSUSEで

ブースで配布した資料はこちらです:
Geeko Magazine vol. 6.1

来月には openSUSE 12.3 の公開があります。リリースイベントも開催する予定です。

16日に日本 Microsoft で行われたオープンソースカンファレンス.Cloud に参加してきました。当日は衆議院選挙の日でしたが、OSC 会場ではクラウドインフラ用(ゲスト)OS 総選挙を行いました。

この総選挙ではクラウドインフラ(EC2, Azure, VPS, …)のゲストに導入している OS と、その OS の理想とするサポート年数(パッチ提供期間)を投票してもらいました。使用用途での分類もしました。

投票結果

「お仕事・本格的」カテゴリでは、事前の予想通り CentOS がトップとなり、RedHat Enterprise を使っている方もいるようです。興味深いのはサポート期間で、

  • クラウドでも長ければ長い方が良い
  • 仮想化するとハードウェアが壊れても使い続けられるので長くなりそう
  • Web フレームワークのサポート期間が3年くらいなので、OSもそれくらいで十分
  • ハードウェアの減価償却で5年+α 欲しい

などの意見があり、3年以内と、5年、それ以上に分かれるようです。5年以上となると、やはり Enterprise 版の出番かと思いますが、3年であれば、コミュニティサポートのディストリビューションでも考えても良いのでは無いかと思います。(openSUSE には Evergreen と呼ばれる LTS サポートチームもあります)

個人的な用途や研究開発ではサポート期間は特に関係ないという意見が占めました。openSUSE 表が7票入っていますが、そのうち4票はユーザ会関係者以外により投じられています。また Ubuntu の割合も多くなっています。

最新号の Geeko Magazine では SUSE Studio を使ってカスタマイズ済の openSUSE のディスクイメージを作り、VPS と Azure 上に簡単に仮想マシンを構築する方法を紹介しました。後日公開予定です。

Tips: Zypper が遅い…そんなときは?

zypper コマンドで search や install をするのに、実行後出力が出るまで待たされることは無いでしょうか?

Zypper が裏で何をしているか、何に時間がかかっているかを知るには、-v オプションを使います。

$ zypper -v search ibus
冗長性: 1
オプション以外のプログラム引数: ‘ibus’
ターゲットを初期化しています
取得しています: repomd.xml ………………………………..[完了 (548 B/s)]
取得しています: content ……………………………………………[完了]
取得しています: media ……………………………………………..[完了]
取得しています: content ……………………………………………[完了]
取得しています: media ……………………………………………..[完了]
取得しています: repomd.xml …………………………………………[完了]
取得しています: repomd.xml …………………………………………[完了]
リポジトリのデータを読み込んでいます…
インストール済みのパッケージを読み込んでいます…
強制的な解決: いいえ (N)

S | 名前 | 概要 | 種類
–+————————————–+———————+—————–
i | ibus | Linux OS 向けイン-> | パッケージ

遅くなる大きな原因はリポジトリの自動更新です。リポジトリの自動更新を有効にすると、上記の例の場合は、検索をする前に、リポジトリの内容が変更されているかをサーバーに問い合わせ、変更されていればリポジトリの情報を取得し直します。 software.opensuse.org の 1-click インストールで、たくさんのリポジトリを登録している場合、これらのリポジトリを1つ1つ調べに行くので、時間がかかります。

手っ取り早い解決策は自動更新を無効にすることです。zypper コマンドからであれば

$ zypper mr –no-refresh リポジトリ番号or名前

で指定したリポジトリの自動更新を無効にできます。リポジトリ番号は

$ zypper repos

で確認できます。もちろん YaST からも変更できます。

自動更新を無効にすると、適当なタイミングでリポジトリの情報を取得しなければいけません。サーバーなどであれば

$ zypper refresh

を、検索やインストールする前に1回だけ実行して下さい。デスクトップであれば Packagekit が定期的にリポジトリの更新を行っていますので、上記のコマンドはあまり必要ありません。

参考: 覚えておきたい! zypper コマンドの使い方