Groonga on ARM

# はじめに

全文検索エンジン[Groonga](http://groonga.org/ja/)は簡単に使えるようにいろいろなディストリビューションでパッケージが提供されています。例えば、DebianやUbuntuやCentOSやFedoraなどです。また、OS XのhomebrewやArch LinuxのAURなどでもメンテナンスがなされているようです。

しかし、それらはあくまで主要なディストリビューションの話であって、それなりのスペックのPCやらサーバーで動かすことを前提にしています。~~全文検索エンジンなので、しょぼいスペックで動かしてもしょうもないという側面もあるので、まぁ当然のことなのですが。~~

# GroongaとARMボード

AMD64系なCPUが主戦場となっているGroongaですが、他のCPUの動向をみると昨今ではARM系CPUの進化がめざましいですね。
スマートフォンなどでもクアッドコアでメモリもそこそこに積んだそれなりのものが普及してきています。~~私はまだシングルコアな古いやつで戦っていますが。それはまた別の話。~~
最近だと64bitなのを当たり前のように積んでいたりもするようです。

![参考画像](http://cubieboard.org/wp-content/uploads/2014/09/cubieboard3_logo.png)

参考画像: シングルボードコンピュータの例: Cubieboardのサイトより

[Raspberry Pi](http://www.raspberrypi.org/)や[Beagle Board](http://beagleboard.org/)、[Cubieboard](http://cubieboard.jp/)といったシングルボードコンピュータもお手軽に入手できるようになっています。となるとその上でGroongaを動かしたくなっても不思議はありません。ありませんよね？

というわけで、GroongaをARMで動かすにあたっての最新事情をこの記事で紹介します。

前提条件は、この記事を書いている時点の最新版である[Groonga 4.0.8](http://groonga.org/ja/blog/2014/11/29/release.html)です。

# ARM対応の壁

Groongaは参照ロックフリーを実現するために、アトミックなメモリ操作を必要としています。逆にいうとそれをサポートしていないとGroongaはまともに動かせません。

Groongaではアセンブラを使えるところでは使う、というようになっています。ソースコードのgrn.hにそのあたりがみてとれます。

ただそうなると環境に応じた対応が必要です。対応から漏れている環境では残念なことにビルドすらできません。そのためこれまでARM対応は残念なことになっていました。

http://buildd.debian-ports.org/status/package.php?p=groonga&suite=sid

![builddstatus.png](https://qiita-image-store.s3.amazonaws.com/0/13564/871c6c45-a40b-1191-0a70-b8d8f1cb2731.png)

上記の表はi386/x86_64以外の環境でのビルド状況です。Groonga 4.0.6とバージョンがちょっと古いやつですが、軒並み対象外になっていることがStateの「uncompiled」からわかります。

# 進んだARM対応

そんな残念な状況でしたが、4.0.8までに新し目のGCCであれば[組み込みのアトミック操作](https://gcc.gnu.org/wiki/Atomic/GCCMM)を利用するようになったので、状況はだいぶ改善できました。

GCC 4.8以降であればおそらくARMでも問題なくビルドできるはずです。

とはいえ、Groongaはビルド時にそれなりのメモリもしくはスワップを要求します。
ビルド時間も結構かかります。カジュアルにソースコードからビルドというのはなかなかつらいものがあります。安価なARMのシングルボードコンピューターだとそんなにメモリは積んでいないことが多いので、一回のビルドに最低1時間コースとか誰も嬉しくないですよね。

# お試しdebパッケージ

ソースからビルドしてくださいね、というのはとても辛いので、お試しでdebパッケージを用意してみました。Debian/testing(jessie)もしくはDebian unstable(sid)向けです。
現在の安定版であるwheezyがないのはGCCのバージョンがちょっと古いせいか、まだうまくビルドできていないからです。

* [Groonga 4.0.8 for Debian jessie](http://packages.groonga.org/tmp/armhf/jessie)
* [Groonga 4.0.8 for Debian unstable](http://packages.groonga.org/tmp/armhf/unstable)

なおリンク先のURLからわかるように、あくまでお試しなので上記debパッケージはそのうち消すかもしれません。


# お試しパッケージのインストール

インストールすれば使えるよというのはちょっと不親切なので、具体的な手順も書いておきます。以下はjessieでの例です。

まずは依存しているパッケージをインストールします。

```bash
$ sudo apt-get install -y libjs-jquery libjs-underscore
$ sudo apt-get install -y libmsgpack3 liblz4-1 libstemmer0d mecab-naist-jdic
```

依存パッケージのインストールが済んだら、次にお試しパッケージをダウンロード展開します。

```bash
$ wget http://packages.groonga.org/tmp/armhf/jessie/groonga-4.0.8-jessie-armhf-deb-20141206.tar.gz
$ tar xvf groonga-4.0.8-jessie-armhf-deb-20141206.tar.gz
```

あとはdpkgで個別のパッケージを指定してインストールします。

```bash
$ sudo dpkg -i groonga_4.0.8-1_armhf.deb groonga-bin_4.0.8-1_armhf.deb groonga-plugin-suggest_4.0.8-1_armhf.deb groonga-tokenizer-mecab_4.0.8-1_armhf.deb groonga-token-filter-stem_4.0.8-1_armhf.deb libgroonga0_4.0.8-1_armhf.deb groonga-doc_4.0.8-1_all.deb groonga-server-common_4.0.8-1_armhf.deb groonga-httpd_4.0.8-1_armhf.deb
```

うまくインストールできたかどうか確認してみましょう。

```bash
$ groonga --version
groonga 4.0.8 [linux-gnueabihf,arm,utf8,match-escalation-threshold=0,nfkc,mecab,msgpack,zlib,lz4,epoll]

configure options: < '--build=arm-linux-gnueabihf' '--prefix=/usr' '--includedir=${prefix}/include' '--mandir=${prefix}/share/man' '--infodir=${prefix}/share/info' '--sysconfdir=/etc' '--localstatedir=/var' '--disable-silent-rules' '--libdir=${prefix}/lib/arm-linux-gnueabihf' '--libexecdir=${prefix}/lib/arm-linux-gnueabihf' '--disable-maintainer-mode' '--disable-dependency-tracking' '--with-munin-plugins' 'build_alias=arm-linux-gnueabihf' 'CFLAGS=-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security' 'LDFLAGS=-fPIE -pie -Wl,-z,relro -Wl,-z,now' 'CPPFLAGS=-D_FORTIFY_SOURCE=2' 'CXXFLAGS=-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security'>
```

サーバーパッケージとしてgroonga-httpdもインストールしておいたので、うまく動いているかどうかを確認してみます。

```bash
$ curl http://localhost:10041/d/status
[[0,1418458243.62141,0.000754117965698242],{"alloc_count":168,"starttime":1418457788,"uptime":455,"version":"4.0.8","n_queries":0,"cache_hit_rate":0.0,"command_version":1,"default_command_version":1,"max_command_version":2}]
```

元気にGroongaが動いているようですね。

# まとめ

今回は、GroongaをARMで動かすにあたっての最新事情とお試しパッケージについて紹介しました、試してみたフィードバック(うまく動いた、動かなかったなど)をもらえると情報を共有できるので助かります。

フィードバックは以下のうちお好きな手段でどうぞ。

* @groonga宛にツイートする
* [Groongaのメーリングリスト](http://lists.sourceforge.jp/mailman/listinfo/groonga-dev)に参加して報告する
* #groongaハッシュタグをつけてこっそりツイートする
* 個人宛て(@kenhys)にツイートする