Mackey's Lab

博士を取るまでの備忘録

博士取得

このブログは博士を取るまでの備忘録だった。

 

まぁ、3日坊主の自分が始めたブログなので案の定1カ月も持たなかったが、久しぶりにログインをしたら結構なPVをいっててびっくりした。

 

しかしながら、本ブログの「博士を取るまで」という所に関して、実は2017年に無事に博士を取得し就職してしまっていたのだ。

 

というわけでこの備忘録はおしまいにしようと思う。

 

まだまだちょいちょいPVされているから消しはしないが、次のステップとして別のブログをオープンしよう。

Gtk-WARNING ** が出たときの対処

コマンドラインから git を操作していて、git pull をしたときに、

$ git pull origin master

(process:6781): Gtk-WARNING **: Locale not supported by C library.
Using the fallback 'C' locale.

(gnome-ssh-askpass:6781): Gtk-WARNING **: cannot open display:

のような警告 (WARNING) が出て pull できなかった。

Gtk-WARNING **: Locale not supported by C library」 の警告に関してはロケールの設定を正しく行うことで回避できるようである。

command line - `Gtk-WARNING **: Locale not supported by C library. ` when starting apps from the commandline - Ask Ubuntu

 

しかしながら、「Gtk-WARNING **: cannot open display」の警告に関してはよく分からない。いろいろ調べてみると、このブログがヒットした。

コンソール越しに git コマンドから Gtk-WARNING **: cannot open display と怒られた時 - Qiita

このブログによると、SSH_ASKPASS という環境変数が指定している gnome-ssh-askpass は GUI を必要とするが、それが起動できないため失敗するとのこと。一番簡単な解決方法としては、

$ unset SSH_ASKPASS

を実行することでこの変数を空にすることらしい。

実際に unset してみるとちゃんと動いてくれた。よかった。

 

O_DIRECT フラグを利用した Direct IO

C++ を利用しての Direct IO で詰まった。

Direct IO とはキャッシュを介さずにファイルシステムに直でアクセスしてしまおうという、まぁ通常ではあまり使いそうにないが、アプリ側で別途キャッシュをしていたり、そもそも RAM FS などでメモリをファイルシステムとしてマウントしている場合に利用できそう。

とにもかくにも Direct IO を使いたくなったので、いろいろ調べて実装はしてみたものをまとめてみる。

 

【参考文献】

今回お世話になった Web サイトは下記のとおり。二つ目はWebサイトではなく man コマンドでいける。

ダイレクトIOの実装 - メモ。。メモ。。

Man page of OPEN

 

Direct IO の実装とは言っても別にたいした事をするわけではない。open 時に O_DIRECT フラグをセットするだけで Direct IO モードでディスクリプタを開くことができる。

問題は、そのディスクリプタを利用して read/write をするときである。Direct IO の場合、アライメントされたバッファ領域に対してブロックサイズの倍数でアクセスする必要がある。これをしないと、read/write が -1 を返礼し、エラーとして EINVAL (Invalid Argument) が帰ってくる。

ブロックサイズは Linux 2.6 以上は 512 で良いみたい。アライメントされたバッファ領域を得るためには通常の new や malloc ではなく posix_memalign を利用する。これで準備完了。

あとは動かすだけ・・・と思いきや問題が発生。

今回 read してバッファに入れたいファイルのファイルサイズは 512byte の倍数ではなく中途半端な値。例えば 600byte としよう。この時、512byte で read すると 88byte 余ってしまう。仕方が無いから 1024byte の領域を確保して read するのだがこれをするとなぜかメモリーがリークしてしまう・・・

現在原因を調査中である。一筋縄でいかない Direct IO である。

 

 

 

 

 

GCC のバージョンを 4.9 に上げる

C++ プログラミングをしていて,C++11 の STL を利用したいときがある。

しかしながら、CentOS 6 とか Ubuntu 12 系列ではあらかじめ入っている(若しくは yum なり apt-get なりでパッケージとして簡単に導入できる)GCCのバージョンは 4.4 系である。残念ながらこれでは C++11 は利用できない。

C++11のどの機能をどの GCC バージョンから利用できるかは下記の本家サイトから確認できる。

C++0x/C++11 Support in GCC - GNU Project - Free Software Foundation (FSF)

 

GCC 4.7 から幾つかの機能が利用できるようになってきており,GCC 4.8 からはほとんどの機能が利用できるようだ。現在は GCC 4.9 があるので今回はこれにバージョンアップしたいと思う。環境は CentOS 6 だが Ubuntu でもあまり変わらないだろう。

バージョンアップの方法はネットでいろいろ公開されており,いろいろ試したが,下記のサイトが一番分かりやすくて良かった。

密かなITエンジニアの備忘録:gcc4.4.7 → 4.9.0にバージョンアップ

この記事は非常にシンプルであったが,幾つか詰まったところもあったのでそこを補完していこうと思う。

 

  1. gcc のソースをダウンロード
    下記のサイトより好きなバージョンの GCC をダウンロード。今回は gcc-4.9.1 を選択した。なおミラーサイトは当然 JAPAN を選ぶべき。今回 GCC をバージョンアップするマシンは WIDE バックボーンに近いところにあるので,ftp.tsukuba.wide.ad.jp を選択。

    GCC mirror sites - GNU Project - Free Software Foundation (FSF)

  2. ダウンロードしたファイルの展開
    ここで詰まることはなかった。tar コマンドで普通に展開すればよろしい。

  3. 必要なパッケージのダウンロード

    # cd gcc-4.9.1
    # ./contrib/download_prerequisites
    # yum -y install glibc-devel*
    # yum -y install gcc-c++*

    いわゆる依存関係にあるパッケージのダウンロード。download_prerequisites というスクリプトが勝手になってくれる便利。しかし,ちょっとここでハマる。このスクリプトは内部的に wget を利用してソースを取ってくるのだが,今回バージョンアップするマシンは実験ネットワーク内にあるため,インターネット接続するのにプロキシが必要なのだ。yum などでは /etc/yum.conf にプロキシの設定を書いているので問題ないが,wget でも同様に /etc/wgetrc にプロキシの設定を書く必要がある。注意すべきなのは http だけでなく ftp プロキシの設定も書く必要があるのだ。詳細は下記の記事へ。

     

    mackey-lab.hatenablog.com

     

  4. ビルド
    ここまでくれば後は簡単。
    # mkdir build# cd build
    # ../configure --disable-multilib
    # make 
    make には非常に時間がかかる。帰る前に make して明日来たら出来てるだろうと思い放置していたらエラーで止まってた。エラーの内容は

    cannot find neither zip nor jar

    zip or jar が無いですというもの。zip をインストールして再度トライ。
    yum install -y zip
    # make
    これでうまくいった。

  5. install & 確認
    普通に make install して gcc -v とすればバージョンが上がっていることがわかる。おわったー!

意外と時間が掛かった。あとはこの作業を繰り返して 72 台のサーバの gcc をアップするだけだ・・・つらい・・・

 

プロキシを利用した wget にハマる

トラブル

プライベートネットワーク環境にあるマシンの gcc バージョンを 4.4 から 4.9 へあげる際にプロキシ経由で wget する必要があった。http の wget は正しく動作するのだが、ftp になるとうまく動作しない。

http プロキシの設定時に /etc/profile に環境変数 HTTP_PROXY,http_proxy の設定と共に環境変数FTP_PROXY,ftp_proxy の設定もしたのに・・・なぜ? 

[root@localhost ~]# wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2
--2015-07-20 23:29:45-- ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr2.4.2.tar.bz2
=> “mpfr-2.4.2.tar.bz2.6”
Connecting to 10.58.59.34:3128... connected.
Logging in as anonymous ... //ここで止まってしまう

 

解決策

結論から言うと,/etc/wgetrc の ftp_proxy の値を書くと動作した。

wget からだと環境変数を見てくれないみたいですね。これで無事に gcc バージョンアップに成功。こんな問題に1時間もかかった・・・悔しい。

# If you do not want to use proxy at all, set this to off.
use_proxy = on
http_proxy = 10.58.59.34:3128
ftp_proxy = 10.58.59.34:3128 //追加

 

10Gbps Ready のための覚え書き(ベンダーロックイン)

10Gbps のスイッチや NIC を購入する上で絶対に考えなくてはならないのは「ベンダーロックイン」である。

これはいわゆるベンダーによるユーザの囲い込み戦略の一つであり、A社のスイッチにはA社の SFP+ トランシーバしか利用できない、といった具合だ。安い NIC やスイッチを販売している会社に限って、このようなベンダーロックインをしており、さらに SFP+ トランシーバの価格がバカ高かったりする。

まるで、プリンター業界のインク販売モデルのようだ。

であるから、ベンダーロックインがされていない会社の製品を買うことはお金の乏しい人々にとっては注目すべき話である。しかし、多くの場合ベンダーロックイン情報は表に出てこない。探せばあることはあるが、眉唾情報が多いのも事実。

そこで経験知を元にベンダーロックイン情報をまとめようと思う。

 

スイッチ

○ ベンダーロックインなし
  • SMC TigerSwitch (SMC8708L2) 
    SMC はベンダーロックインないがもう 10Gbps スイッチ製品を作ってないようだ・・・

  • Dell PowerConnect 
    Dell はベンダーロックインしないで有名な会社。製品自体は安く使い勝手が良いので複数台所有している。なお、Dell の SFP+ は Finisor のものと同一製品のようだ。

  • Force10 
    Force10 は Dell に買収されたので Dell と同じくベンダーロックインはない。サーバルームにほこり被ってたのを譲り受けてバリバリ使用中。

  • NETGEAR (XSM7224S (現在は M7300-24XF))
    24ポートフル10Gの癖して 150 万という安さなので購入して利用していた。そこそこ良い感じだからもう一台欲しいなと思ってたら型番変更のため旧型番が Amazon で 50万で投げ売りされてたので衝動買い。ベンダーロックインでないのでどの会社の SFP+ も大丈夫。DACもばっちこい!
 ○ ベンダーロックインあり
  • Cisco シリーズ(解除可能)
    Cisco は長年ベンダーロックインするような会社だったんですが、最近オープン戦略に目覚めたらしくコマンドラインでベンダーロックインを解除可能。王者の余裕が垣間見える。

  • HP 
    最低の会社。スイッチは安いが光モジュールがクソ高い。1Gbpsの光ファイバーネットワーク(1000BASE-LX)を構築した際に購入したが大失敗。LX の光トランシーバ10万ってなんやねん!マジ死ねクソ。

 

NIC

情報が少ないので現在情報を探し中。

○ ベンダーロックインなし
  • Myricom
    よく利用している NIC の会社の一つ。どのトランシーバでも受け付ける。もちろんDACもOK。

  • Mellanox
    ベンダーロックインをしないとプレスリリースで明言していた。NIC自体はMyricomより安いので心揺れる。利用したことは多分あったと思うが、Myricom との性能差については不明。
○ ベンダーロックインあり
  • Intel 
    サーバ買ったときに 10Gbps のNICをオプションでつけると多くの場合こいつがついてくる。Intel の SFP+ しか受け付けない。複数枚所持しているが利用する度に Intel のトランシーバ探す必要があるので苦労する。モジュールはそこまで高くない。
サーベイ中(不明)
  • SmallTree
  • Solarflare(これは多分大丈夫)
  • Chelsio
  • Qlogic 

10Gbps Ready のための覚え書き(はじめに)

この記事は 10Gbps を日常的に利用する中で得られた知識をまとめる記事である。そのため、どんどん追記して行く予定である。

・はじめに
光ファイバー編
・スイッチ&NIC
・ベンダーロックイン

 

【はじめに】

大量のデータを送信するためには現在一般的に利用されているギガビットイーサーネット(1Gbps)よりもさらに高速な10Gbps イーサーネット(10GbE)を利用する。私が所属する研究室では大容量のデータを伝送する研究を実施しているため 2011年頃より徐々に10GbEネットワークを導入し始めた。

10GbE の規格は10種類を越えるためここではすべてを紹介しない。興味がある方は下記のリンクに10GbEの歴史や規格が的確にまとまっている。

ASCII.jp:SFP+って?日立電線に聞いた光トランシーバの基礎 (1/3)

 

10GbE に限らずネットワークは物理的には「コンピュータ本体」「NIC」「伝送媒体」の3つによって構成されている。例えばよく利用される 1Gbps ネットワークでは、UTP(いわゆる LANケーブル)が伝送媒体となり UTP とコンピュータ本体を繋ぐものがNIC (Network Interface Card) である。

この構図は 10GbE になっても変わらない。10GbEでネットワークを構築するにはネットワークに繋げる各コンピュータに10GbE用のNICが必要で,そのNICが対応している伝送媒体(ケーブル)が必要になる。

基本はそれだけ。非常に単純。
しかしながら、実際に利用される規格がほとんど決まってしまっているギガビットイーサーネットに比べて 10GbE は、NICやケーブルに様々な規格がありわかりにくい。そのため、なるべくわかりやすいように、そしてよく利用されている(ように感じる)ものを中心にまとめていく。