タグ「Tokyo Tyrant」が付けられているもの

Solaris10(x86)でのtcucodec confの結果

SPARC機を探したのですが私の権限で触れるところにはありませんでした。
http://1978th.net/tech/promenade.cgi?id=39

というわけで私の家のSolarisでの結果を。
Core2Quad 9650上の64ビットLinux上にVMWareでSolarisを動かしている嘘んこ環境ですが・・。

SunOS tamsvr11 5.10 Generic_137138-09 i86pc i386 i86pc Solaris
 
[tamtam@tamsvr11 tokyocabinet-1.4.39]$ ./tcucodec conf
myconf(version): 1.4.39
myconf(sysname): SunOS
myconf(libver): 902
myconf(formatver): 1.0
myconf(prefix): /usr/local
myconf(includedir): /usr/local/include
myconf(libdir): /usr/local/lib
myconf(bindir): /usr/local/bin
myconf(libexecdir): /usr/local/libexec
myconf(appinc): -I/usr/local/include
myconf(applibs): -L/usr/local/lib -ltokyocabinet -lbz2 -lz -lrt -lpthread -lm -lc
myconf(bigend): 0
myconf(usezlib): 1
myconf(usebzip): 1
type(bool): size=1 align=1 offset=1 max=1
type(char): size=1 align=1 offset=1 max=127
type(short): size=2 align=2 offset=2 max=32767
type(int): size=4 align=4 offset=4 max=2147483647
type(long): size=4 align=4 offset=4 max=2147483647
type(long long): size=8 align=8 offset=4 max=9223372036854775807
type(float): size=4 align=4 offset=4 max=3.40282e+38
type(double): size=8 align=8 offset=4 max=1.79769e+308
type(long double): size=12 align=4 offset=4 max=1.18973e+4932
type(void *): size=4 align=4 offset=4
type(intptr_t): size=4 align=4 offset=4 max=2147483647
type(size_t): size=4 align=4 offset=4 max=4294967295
type(ptrdiff_t): size=4 align=4 offset=4 max=2147483647
type(wchar_t): size=4 align=4 offset=4 max=2147483647
type(sig_atomic_t): size=4 align=4 offset=4 max=2147483647
type(time_t): size=4 align=4 offset=4 max=2147483647
type(off_t): size=4 align=4 offset=4 max=2147483647
type(ino_t): size=4 align=4 offset=4 max=4294967295
type(tcgeneric_t): size=8 align=4 offset=4
macro(RAND_MAX): 32767
macro(PATH_MAX): 1024
macro(NAME_MAX): 255
macro(P_tmpdir): /var/tmp/
sysconf(_SC_CLK_TCK): 100
sysconf(_SC_OPEN_MAX): 256
sysconf(_SC_PAGESIZE): 4096
sysinfo(utime): 0.002330
sysinfo(stime): 0.005270
stat(st_uid): 100
stat(st_gid): 100
stat(st_blksize): 8192

Solaris10でTCとTTをビルドするメモ

Solaris10でTCとTTが動作するようになってからというもの、最新版をずっと試していなかったので久しぶりにビルドしてみました。ちなみに会社にもインストールしていますが、会社ではLua拡張も組み込んでいます。社内用に構文や機能が追加してあるLua拡張版があるのですが、私は標準のままのLuaを使っています。

今回はLuaをサポートしない場合のビルドメモ。

Luaを組み込んでビルドします。他の記事にLuaにビルドの記事がありますので、Luaについてはそちらを参照。

wget http://tokyocabinet.sourceforge.net/tokyocabinet-1.4.17.tar.gz
gtar -zxvf tokyocabinet-1.4.17.tar.gz
cd tokyocabinet-1.4.17
./configure \
  CC=gcc \
  --prefix=/export/home/tamtam/service/tc-1.4.17
gmake
gmake install
wget http://tokyocabinet.sourceforge.net/tyrantpkg/tokyotyrant-1.1.23.tar.gz
gtar -zxvf tokyotyrant-1.1.23.tar.gz
cd tokyotyrant-1.1.23
./configure \
  CC=gcc \
  LDFLAGS="-R/export/home/tamtam/service/tc-1.4.17/lib -R/export/home/tamtam/service/tt-1.1.23/lib" \
  --prefix=/export/home/tamtam/service/tt-1.1.23 \
  --with-tc=/export/home/tamtam/service/tc-1.4.17 \
  --enable-lua \
  --with-lua=/usr/local
gmake
gmake install

無事にビルドできました。

Tokyo CabinetもTokyo TyrantもSolaris10で動作するようになりました。ビルドもすんなり通ります。

\(^o^)/ヤター!

Luaをくっつけて色々試してます。

 

Solaris8やSolaris9では動かないですって・・・?
知らない!!!

Solarisは8から/dev/poll使えるのでそれで・・・(´∩ω∩`)

前回の記事の対応ではスピードが出ません。
というわけでちょっとport_getnの所を修正しました。
make checkでそこそこの速度で全部通るようになりました。

あ、補足ですがtokyo cabinetの最新版はSolaris10で何も指定しなくても普通に通るようになりました。

今回対象にしたのは、tokyotyrant-1.1.14です。(今日付で最新版が出ていますが対応は基本的に同じでいけると思います)

開発環境はSolaris10 x86_64です。uname -aの結果は、
「SunOS tamsvr11 5.10 Generic_137138-09 i86pc i386 i86pc Solaris」です。

というわけで以下修正ソースです。

 

※書き直しました。(2009/2/16)
https://mt.orz.at/archives/2009/02/tokyo-tyrantsol-2.html こちらの記事をどうぞ。

 

最初に断っておきますが、このやり方はとてもよろしくない方法で対応しています。
本来ならばEPOLL関連の関数に準ずる形でエミュレートするのが正しい方法だと思うのですが、力不足によりttutl.cの中に#ifdefでSolaris用に処理を追加するという暴挙に出てしまいました(´・д・`)
ですので、参考にしてはいけません。

言い訳をするとですね、waitの中でONESHOTフラグでない場合は再登録(port_assosiate)するという方法が動かなかったのです。後できちんと調べてmyconfの修正だけでいけるようにガンバリマス(*・ε・*)

・・・今書いてて思うのですが、ttの場合エミュレートしないといけないepoll系の関数は3つしかなくて、epoll_create()は最初の初期化、epoll_ctlは監視の登録/解除、epoll_waitは読み込み可能なFDを返す、という至極単純な動作なので自前である程度のフラグを管理すればどんな方法でも動くはずだと思いました。

というわけでソースを載せていきます。

# TokyoとTyrant(Cabinet)の間はスペース入れるのが推奨みたいです(´・д・`)

それはさておき、

とりあえず動きましたヽ( `・ω・´)ノ

/dev/pollのサンプルが全然なかったので、Sunのページとlibeventを参考にしました。
(sun) http://docs.sun.com/app/docs/doc/816-5177/poll-7d?l=pt_br&a=view
(libevent) http://monkey.org/~provos/libevent/
(libev) http://software.schmorp.de/pkg/libev.html

今更だけどlibevも見れば良かった・・。
簡単なechoサーバのサンプルがあると嬉しかったのですが、見つけられなかった。゚(゚´Д`゚)゚。

とりあえず環境的なところで詰まったのは、/usr/ccs/bin/ldだと-soname指定が上手く動かない事。--with-ldとか指定してもダメだったので、とりあえず以下のページを参考にして/usr/local/bin/ldにシンボリックリンクを張りました。
http://www.rinneza.com/junya/tech/solaris10_x86/network/samba_3.2.4.html

あとはTokyo Cabinet同様にconfigure中のstd=c99をstd=gnu99に変更。

今後やることは、

今は最初に確保した配列を全部/dev/pollのハンドラに書き込んでいるので、これを必要な分だけ登録する。(配列[fd].xxxxって処理してるのを0,1,2,と使うように変更する。)
でもどっちが良いのかな・・。 ゥ─σ(・´ω・`*)─ン…

あとは↑の配列の確保をcallocで処理しているので、終了時にメモリ解放のコードを入れてあげる。
(終了時だから解放しなくても良いものなのかな・・? ってダメだよね・・ (´・д・`))

なんでcalloc使っているかと言うと、以下のようなコードで配列の添え字を求めているからです。

  int nfiles = 32000;
  struct rlimit rl;
  if (getrlimit(RLIMIT_NOFILE, &rl) == 0 &&
      rl.rlim_cur != RLIM_INFINITY)
    nfiles = rl.rlim_cur;

もうちょっと負荷かけたりスレッド周りの検証したらコードも公開します。
追加したコードはfprintfのデバッグコードも含めて100行くらいでした。

 

追記 2009/1/25 23:00

複数接続でIOがブロックされちゃうのと、切断時に何回もCLOSEを試みて↓のエラーが数秒出続けてしまう。その間は新規接続も受け付けてくれない・・。
2009-01-25T23:24:24+09:00       close failed
2009-01-25T23:24:24+09:00       connection finished
・・・

 

Tokyo TyrantをSolaris10に対応させる方法として考えられる方針は以下になります。

  • epoll使っている部分の実装を書き換えちゃう
  • libeventを使う
  • epoll_create, epoll_ctl, epoll_waitをエミュレートする

ソースを見るとkqueueの場合はepollのエミュレートをしていてepollに寄せているみたいなので、とりあえず/dev/pollの実装も寄せる方向で実装してみようと思います。(libeventの使い方を覚えるのが面倒という理由もちょっと有り)

それにしてもSolarisユーザーほんと少ないですね(´・ω・`)
情報が少ない(´∩ω∩`)