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

zfsのキャッシュサイズ(c_max)調整

ZFSはデフォルトで搭載メモリの3/4までキャッシュするような実装になっています。メモリ4GB積んでいると3GBまでキャッシュするようになっているわけですね。ファイルサーバとしてしか使わないのであれば、それでも良いのですが、他にもメモリを使いたいのでちょっと調整してみます。

まずは、現在の値を確認します。

root@tamsvr00:~# kstat | grep c_max
        c_max                           3206670336

そして変更します。/etc/systemに以下の記述を追加します。

set zfs:zfs_arc_max = 0x40000000

これで1GBになります。再起動必須です。

再起動後、もっかい確認すると設定が変更されています。

root@tamsvr00:~# kstat | grep c_max
        c_max                           1073741824

「zfs_arc_max」で検索をすると、それっぽい記事が(というかGoogleの一番上にZFSのTuningに関するWikiが)ヒットします。

どこかの勉強会で、メモリ云々でソースを書き換えたとか言ってた人が居たので、この設定で変更できますよっと。(というかソース書き換えたって事はソース見ているって事だから設定値読んでいるって事も分かっているはず。という事は、これの事ではないのかな・・?)

 

ちなみにこのネタは会社の人に教えて貰ったものだったのでした。

ZFS on Solaris

久しぶりの更新です。
非常にバタバタしている・・というか、月300時間労働超えました(´・ω・)ウエェ・・。

クローラーを動かしたり、色々と実験をしているのでファイル置き場が無くなってその度にサーバを止めてHDDを追加していくのは大変です。というわけで、今回はそこそこ容量の大きなファイルサーバを追加しました。

構成は以下になります。

  • OpenSolaris (Solaris10はライセンスが・・・)
  • AtomD510
  • メモリ4GB
  • HDD IDE 80GB (システム用)
  • HDD SATA 2TB * 4基 (データ用)
  • GigabitLAN * 1

最初はUSBにインストールして使おうとしましたが、USBへの書き込みが発生するとシステム全体が止まって使い物にならなかったのでHDDにインストールする事にしました。

DVDドライブはないので、LiveUSBでブート。それからHDDにインストール。(Liveで起動するとインストールするというアイコンがあるので、それで)。最初はLiveUSBブート → USBにインストールでしたが、↑の理由により断念。

ZFSは非常に簡単。今回はrootで以下のコマンドを叩くだけ。

    zpool create data raidz c4t0d0 c4t1d0 c7d0 c8d0

これだけです。 これだけで/dataにマウントまでしてくれます。マウントを変えたい場合は「zfs set mountpoint」で変更するだけ。NFSで共有したい場合は、

    zfs set sharenfs=on data

これだけです。

raidzはRAID5と同等です。(いやー本当はraidz2にしたいのですがHDDが足りなくて・・・)。raid5とか会社で運用しているところがあればプギャー・・ですね。

root@tamsvr00:~# zpool list
NAME    SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
data   7.25T  1.31M  7.25T     0%  ONLINE  -
rpool    76G  6.62G  69.4G     8%  ONLINE  -
root@tamsvr00:~# zpool status
  pool: data
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        data        ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            c0t0d0  ONLINE       0     0     0
            c0t1d0  ONLINE       0     0     0
            c7d0    ONLINE       0     0     0
            c8d0    ONLINE       0     0     0

errors: No known data errors

  pool: rpool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          c1d0s0    ONLINE       0     0     0
root@tamsvr00:~# df -h
Filesystem            Size  Used Avail Use% Mounted on
rpool/ROOT/opensolaris
                       71G  4.3G   67G   7% /
swap                  4.8G  324K  4.8G   1% /etc/svc/volatile
/usr/lib/libc/libc_hwcap1.so.1
                       71G  4.3G   67G   7% /lib/libc.so.1
swap                  4.8G  8.0K  4.8G   1% /tmp
swap                  4.8G   48K  4.8G   1% /var/run
data                  5.4T  927K  5.4T   1% /data
rpool/export           67G   23K   67G   1% /export
rpool/export/home      67G   23K   67G   1% /export/home
rpool/export/home/tamtam
                       67G   45M   67G   1% /export/home/tamtam
rpool                  67G   81K   67G   1% /rpool

こんな感じでパリティ有で5.4TBの領域が出来ました。
これを各サーバで共有するのと、WindowsからはSambaでファイル置き場として共有します。CPUがあまり気味なのでMercurialやMailサーバくらい置こうかな。

Memcached1.4.2をx86_Solaris10でビルドする

libevent-1.4.12とmemcached-1.4.2の組み合わせでビルド環境は↓のような感じです。

$uname -a
SunOS tamsvr11 5.10 Generic_137138-09 i86pc i386 i86pc Solaris

$gcc -v
/usr/local/lib/gcc/i386-pc-solaris2.10/3.4.6/specs から spec を読み込み中
コンフィグオプション: ../configure --with-as=/usr/ccs/bin/as --with-ld=/usr/ccs/bin/ld --enable-shared --enable-languages=c,c++,f77
スレッドモデル: posix
gcc バージョン 3.4.6

libeventは普通にconfigureしてgmake; gmake installで通ります。

memcachedは-pthreadなんてオプション知らないよ!怒られます。というわけで怒られないようにするには3種類の方法があります。1つはGCCを使わない(ぉぃ)。2つめはconfigure時に「--disable-coverage」をつける。3つめはMakefileの-pthreadを-pthreadsに置換する。(最後にsがついているのが違いです)

2番目のやり方だと以下のような感じになります。

./configure --prefix=/export/home/tamtam/service/memcached-1.4.
2 --with-libevent=/export/home/tamtam/service/libevent-1.4.12 --disable-coverage
gmake
gmake install

3番目のやり方だと以下のような感じになります。

./configure --prefix=/export/home/tamtam/service/memcached-1.4.
2 --with-libevent=/export/home/tamtam/service/libevent-1.4.12
perl -i -p -e "s/-pthread/-pthreads/g;" Makefile
gmake
gmake install

本当はLDFLAGSに-Rxxxとか指定してますが省略しました。

Solaris10にIntelのPWLA8391GTを載せてみた

SolarisはなかなかめんどくさいOSですねぇ。自動認識でセットアップしてくれぬ。結構戸惑いましたが何とか認識させる事ができました。

蟹チップをFreeNICDriversForSolarisで動かしていたので、まずはこれを退避します。

mv hostname.rf0 _hostname.rf0
mv hostname6.rf0 _hostname6.rf0

/etc/driver_aliasesに以下の行を追加する。

e1000g "pci8086,1376"

次回起動時に自動的にデバイスの再構成を実行させる

touch /reconfigure

というわけで一回再起動します。

shutdown -y -g0 -i5

/var/adm/messagesに次のようなログが出ていれば認識に成功しています。

ホスト名 e1000g: [ID 766679 kern.info] Intel(R) PRO/1000 Network Connection, Driver Ver. 5.2.

この段階ではifconfigには出てきません。 次のコマンドを打ちます。

ifconfig e1000g0 plumb

/etc/hostname.e1000g0と/etc/hostname6.e1000g0を作成します。前者はホスト名を中に後者は空です。

echo "ホスト名" > /etc/hostname.e1000g0
touch /etc/hostname6.e1000g0

ここで再起動してNICが自動構成でONになっているかを確認しておきます。

次はジャンボフレームの対応です。

/kernel/drv/e1000g.confを修正します。

(変更前) #MaxFrameSize=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
(変更後) MaxFrameSize=3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3;

/etc/hostname.e1000g0を変更する(16Kは大きすぎるので9000に変更)

echo "ホスト名 mtu 9000" > /etc/hostname.e1000g0

こんな感じで認識させることができました。インストール時に刺しておけばプライマリネットワークインターフェースとして色々と構成してくれるのかもしれません。

 

今回、ものすごく参考になったページは以下です。感謝ヽ( `・ω・´)ノ

http://jp.sun.com/communities/0603/feature02.html

Solarisで認識するNIC

SolarisのNIC認識は鬼門です。
サーバ機ならともかく一般のPCは蟹チップがほとんどなので標準のドライバでは認識しない事が多いです。ユーザーが作ったドライバで認識させる事も可能ですが動作保証外なもので運用するのは精神的健康に良くないです。

SunのページでHCL(ハードウェア互換一覧)を確認できます。
http://www.sun.com/bigadmin/hcl/data/sol/components/views/networking_certified.page1.html

残念ながらRealtekはありませんでした。Reported to WorkにはあるのでFreeのドライバを入れれば認識させる事は可能です。INTELのNIC買うのが確実ですけどね!

Solaris10にlua-5.1.4をインストール

Solaris10にLua-5.1.4をインストールしてみます。

事前にgcc4をインストールしないと警告がいっぱい出ます。gcc4のインストールは別の記事に書いてあるのでそちらを参照。

wget http://www.lua.org/ftp/lua-5.1.4.tar.gz
gtar -zxvf lua-5.1.4.tar.gz
cd lua-5.1.4
gmake solaris
gmake install INSTALL_TOP=/usr/local

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

まぁ・・・Luaはパッケージがあるのでpkgaddで入れれば良いと思います。

Lua5.1.4をSolaris10の素のままでビルドしようとすると警告が沢山でるのでgcc-4.4.0をインストールしてみます。ちなみに警告は「visibility attribute not supported in this configuration」といった感じのものでgcc4からサポートされたやつみたいです。staticな関数をライブラリの外に出す/出さないを指定できるgcc拡張のようです。

またgcc4.1以降はlibgmpとlibmpfrが必要との事なので、これらを事前にビルドします。

まずはlibgmpをwgetで取得してgtarで展開します。その後以下の手順でビルド。

cd gmp-4.2.4
./configure --prefix=/usr/local/gcc4 --build=i386-sun-solaris2.10
gmake
gmake check
gmake install

ちなみに、--buildオプションを指定しないとビルドに失敗しました。どうやら「core2-pc-solaris2.10」と認識されていたのが原因のようです。こちらのページを参考にさせていただきました。

次にlibmpfrをビルドします。こちらもwgetで取得してgtarで展開します。その後以下の手順でビルド。

cd mpfr-2.4.0
./configure --prefix=/usr/local/gcc4 --with-gmp=/usr/local/gcc4
gmake
gmake check
gmake install

これでgccをビルドする準備が整いました。
その前に、LD_LIBRARY_PATHに/usr/local/gcc4/libを入れておかないとlibgccのコンパイルでこけます。
gcc-core-4.4.0.tar.gzとgcc-g++-4.4.0.tar.gzを取得してgtarで展開します。

cd gcc-4.4.0

./configure \
--prefix=/usr/local/gcc4 \
--with-ar=/usr/ccs/bin/ar \
--with-as=/usr/ccs/bin/as \
--with-ld=/usr/ccs/bin/ld \
--enable-shared \
--enable-languages=c,c++ \
--with-gmp=/usr/local/gcc4 \
--with-mpfr=/usr/local/gcc4

gmake bootstrap
gmake install

一応確認。

/usr/local/gcc4/bin/gcc -v
Using built-in specs.
Target: i386-pc-solaris2.10
コンフィグオプション: ./configure --prefix=/usr/local/gcc4 --with-ar=/usr/ccs/bin/ar --with-as=/usr/ccs/bin/as --with-ld=/usr/ccs/bin/ld --enable-shared --enable-languages=c,c++ --with-gmp=/usr/local/gcc4 --with-mpfr=/usr/local/gcc4
スレッドモデル: posix
gcc version 4.4.0 (GCC)

そして環境変数のPATHにも/usr/local/gcc4/binを入れます。 
Luaのビルドは別の記事で。

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

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

前回の記事の対応ではスピードが出ません。
というわけでちょっと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を返す、という至極単純な動作なので自前である程度のフラグを管理すればどんな方法でも動くはずだと思いました。

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

最新版をSolaris10でコンパイルしてみたです。
いつの間にかSunOSの定義でごにょごにょと分岐が追加されていました!ありがとうmikioさん!(もしかしてこのBLOG見てるのかな(*´∀`))

これでSolaris10でもすんなりビルドが・・・通りませんでした(´・ω・)
堅牢なOSなのは認めるし最近のコンテナやZFS、Dtraceはすばらしい技術だと思うけど、正直なところビルドくらい何も考えないで通って欲しい。。゚(゚´Д`゚)゚。  お願いしますよ。Sunマイクロシステムズ様。

で、やっぱりrealpath関係で怒られました。

Solaris10でrealpathが使えるようになるには、以下の条件を満たす必要があるみたいです。

#if defined(__EXTENSIONS__) || \
        (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
        defined(_XPG4_2)

std=c99をつけると、 __STRICT_ANSI__マクロが定義されます。
/usr/include/sys/feature_tests.hをひもといていくと、_STRICT_STDCが定義されるので上記の条件(の2行目のやつ)を満たさなくなってしまうようです。ここ(manpage)を見ると色々書いてあります。

これを回避するには以下の2つの方法があります。(正確にはもっとありますけど、試していません)

  • __EXTENSIONS__を定義する
  • std=c99をstd=gnu99にする

どれくらい影響範囲があるのか分からないので自己責任で好きな方を選択すれば良いと思います。

前者の場合は、以下のようにconfigureで指定します。

./configure CFLAGS="-D__EXTENSIONS__"

後者の場合は、configureとconfigure.inに記述されている内容を置換します。(configureした後にMakefileを修正しても良いですけど)

perl -i -p -e "s/c99/gnu99/g;" configure*

あとは普通にビルドをします。

gmake >/dev/null
tcutil.c:7401: 警告: 初期化子のまわりのブレースを欠いています
tcutil.c:7401: 警告: (`tcglobalmutexonce.__pthread_once_pad' の初期化は不完全です)
tcutil.c: In function `tcbwtdecode':
tcutil.c:7717: 警告: statement with no effect
tcutil.c: In function `tcbwtencode':
tcutil.c:7677: 警告: statement with no effect
ar: creating libtokyocabinet.a

出ている警告は全て動作に対して影響はありません。最初の2個の警告は前回の記事に回避策が書いてあります。(でも、わざわざ修正するような内容ではありません(*・ε・*))

ちなみにマクロの定義一覧を出したい場合は以下のような感じで出せます(2個ほどマクロ定義してあるのはTokyo Cabinetビルドしたらこのマクロももれなくついてきたので。)。実際のソースに対してやると何千行も出てきてしまいますが、以下の場合はその環境で最低限定義されるものが出てきます。(100行もないはずです)

 gcc -std=gnu99 -D_GNU_SOURCE=1 -D_REENTRANT -E -dM -x c /dev/null

 

ちょっと気になった点について。
1.4.2,3,4辺りでpthread_yield()の実装が毎回変更されていて今はusleepになっていますが、これってやっぱりusleepのが速いからなんでしょうか。Solaris10の場合、sched_yieldの実装はシステムコールのthr_yieldになっていて、これがスレッドセーフだから遅いのと、yieldすると必要ない場合でもコンテキストスイッチが走るから・・・なのかにゃ(´・ω・)

 

# 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ユーザーほんと少ないですね(´・ω・`)
情報が少ない(´∩ω∩`)

Tokyo Cabinetってなんぞ?という人は、
http://tokyocabinet.sourceforge.net/
このページを。

Tokyo TyrantをSolaris10で動かすために、まずはTokyo Cabinetをビルドしようとしたらいろいろと怒られたので無理矢理ビルドを通してみました。正しい修正かどうかは知りません(*・ε・*)
なので指摘は大歓迎です。

環境は「SunOS tamsvr10 5.10 Generic_127128-11 i86pc i386 i86pc Solaris」です。
あとgccやccが混在していたり、いろいろ弄っていた環境なので実は素のSolarisだとすんなり通っちゃうのかもしれません。

アーカイブをげっちゅ。

wget http://tokyocabinet.sourceforge.net/tokyocabinet-1.4.1.tar.gz
gtar zxvf tokyocabinet-1.4.1.tar.gz
cd tokyocabinet-1.4.1

まずはconfigureを弄ります。これはrealpathが云々と怒られる対策です。std=c99をstd=gnu99にします。特に外から設定を与えない場合は1カ所の修正で大丈夫ですが、fastestの場合とか中で結構分岐していたので弄くり倒す予定の人は一括置換してください。

 MYCFLAGS="-std=gnu99 -Wall -fPIC -fsigned-char -O2"

Solaris10では「pthread_yield()なんて実装は排除しちゃったよ。あなたたちは違うんです。フフンっ。」という事らしいので、その代わりに「sched_yield」を使います。
本当は「_POSIX_PRIORITY_SCHEDULING」が定義されているか確認して、定義されていれば↓を、そうでなければ別の代替実装をするのが正しいのかもしれません。

// myconfig.hの413行目くらい
#if defined(_SYS_SUNOS_) && TCUSEPTHREAD
#include <sched.h>
#define pthread_yield() sched_yield()
#endif

警告が気持ち悪いのでtcutils.cを弄ります。

// tcutils.c
//static pthread_once_t tcglobalmutexonce = PTHREAD_ONCE_INIT;
static pthread_once_t tcglobalmutexonce = {PTHREAD_ONCE_INIT};

あとはconfigureしてgmakeします。
-D_REENTRANTはgmtime_r, localtime_rの実装を有効にするために、LIBS="-lrt"はsched_yield関連で必要です。

./configure CC=gcc CFLAGS="-D_REENTRANT" LIBS="-lrt"
gmake

まだ動くかどうか確認していません(; ・`д・´)
これで動いたら次はTokyoTyrantの/dev/poll対応してみます。

※追記:動きました。

Solaris10壊れた(´・ェ・`)

  • 投稿日:
  • カテゴリ:

Solaris10にOracle10gR2を入れるべく、イロイロ設定してたのですが、その前にMySQLやPHPのビルドのために色々なパッケージを入れてしまったせいでfont-cacheが壊れました・・・。
gdmと打ち込んでも、立ち上がりません・・・。
正確には、起動して・・・落ちて・・起動して・・落ちてを5,6回繰り返して終了します。

仕方がないので、ローカルマシンのCygwinにXサーバをたてて、SSHで転送しました。
いやー・・・便利ですね!!

 startx &
 xhost +
 ssh サーバ名
 export DISPLAY=ローカルマシン:0.0
 runInstaller -ignoreSysPreReqs