you21979の日記

実験ネタとか。仮想化とかnodejsで嵌った所とかおもしろかったところとかいろいろ

簡単になったGPUパススルー

富士通のFMVじゃなくてprimergy tx100 s3pという安鯖をいまさら買ってみた。

メモリはなんか3月に比べて倍近くになってるようで円安に加えかなり供給を絞ってるから急な値上がりになってる模様。

買う時期が悪いように見えるがそれでも安いと思える安鯖。

primergy tx100 s3p:ヤフオクで6000円(送料込み)

Xeon e3-1230v2(4core8thread):アマゾンで23500円

ECC DDR3 8GB*2=16GB:アマゾンで18500円

pci1:radeon 6570ファンレス

pci2:usb3

pci3:空き

pci4:pt3

OS:VMWARE ESXi5.1

 

ちなみにヤフオクだと4core*2のハイパースレッド16コア機がたまに3万で出てる。

 

この安鯖構成のなにがいいかというとGPUパススルー(VGAパススルー)がとても簡単であること。

ハイパーバイザー用のグラボをささなくてもよいことがあげられる。(オンボードがある)

ESXi使いにはやさしいNICが2つあること。

NIC二枚あるといろんなネットワークの実験がやりやすい。

 

そしてAMD機についてたハードディスク付け替えただけで再インストール無しで環境移行がすんだこと。(esxiすら再インストールいらず)

当然esxi上で動いてたVMもそのまま動く。

簡単すぎて泣けてくる。

 

GPUパススルーのなにが大変だったかというと

以前の環境ではパススルーしてもドライバ入れたりするとBSOD

パススルーできたと思ってもGPU使う処理(dxvaなど)すると画面が乱れたり崩れたり。

kvmとかだとkernelに渡すbootパラメータ調整とかすれば直ったりしたけど

esxiでは対処の仕様がなかった。

USBのパススルーにまだ少し問題があるとはいえその辺乗りこえれば普通に使えるレベルに達したのがよい

 

#部材選定に当たって以下のWIKIがとても参考になりました

http://wiki.nothing.sh/page/%C9%D9%BB%CE%C4%CC%20PRIMERGY%20TX100%20S3p

 

#GPUパススルー上で問題なく使えたアプリ

League of Legends

MPC-HC(dxva)

 

#アイドル時の消費電力

120w が 50wへ。(グラボささなければもう少し減る)

 

#サウンド

以前はUSBサウンドを使用してたけど今はhdmiからspdifをとってる。USBと違って音飛びしない

http://item.rakuten.co.jp/donya/84480/

 

#ESXiの個人的なTIPS集

https://gist.github.com/you21979/6098759

 

富士通 PRIMERGY TX100 S3 OSレスタイプ PYT10PZD2X

富士通 PRIMERGY TX100 S3 OSレスタイプ PYT10PZD2X

 

node.jsで簡単にircへメッセージ送信

https://github.com/you21979/bot-irc-notifier

 

サーバーからircにサーバー落ちたよとエラーメッセージを通知をするシステムが欲しかったので作ってみた。

ただ作るだけじゃおもしろくないのでtypescriptで作ってみたけど単純な仕組みなので

あまり型の恩恵ない。

 

さて、実装方法だがredisを使っている

なんで使っているかというと

・redisはコマンドラインから簡単にメッセージを流せる

・redisとircはどちらもチャンネルと言う概念がある

・npmにライブラリがある

 

チャンネルという共通点を生かしてredisのチャンネルにポストすればirc上の同じチャンネルにポストするようにすればチャンネルも送信時に選べるしお手軽。

(irc側は事前にチャンネルに入っておく必要があるけども) 

 

こういうシステムとシステムを繋げるのにnodeはお手軽にできるからいいね

 

↓みたいなシェルでircにポストできる

#!/bin/bash
CHANNEL="#hogehoge"
MESSAGE="テストです"
redis-cli publish $CHANNEL $MESSAGE

スキルシート

プログラマの求人みていて思うのだがなぜ言語を最重要視するのだろうといつも思ってた。

言語はたしかに大事だがそれは道具の使い方の話だろうし武器にたとえるならいろいろな流派もあるはずだ。

 

武人にもしスキルシートがあればこんな感じだろうし

・流派

 柳生新陰流(日本刀)

 宝蔵院流槍術(十文字槍)

・奥義

 無刀取り

 活人剣

 居合

・型(稽古、基本戦術)

 燕飛

 三学圓之太刀

 奧之太刀

 槍しごき

 

プログラマもこんな感じでいいんじゃね?と思ってしまう。

・流派

 C++Lua

・奥義

 メタプログラミング

 人工知能

・型(稽古、基本戦術)

 オブジェクト指向プログラミング

 関数型プログラミング

 モデル駆動開発

 デザインパターン

 テスト駆動開発

 

求人募集をみても流派の募集しかしてないところが多い。

みんな流派(環境)を重視してるのだろうか

システム開発とは流派ありきなんだろうか

 

戦で兵を募るときは流派で募集かけたりするものだろうか

 

#厨二病っぽい

re:Ryan Dahl の面接試験:csv データのオブジェクト配列への変換

中島聡さんのブログにある頭の体操をやってみた

所要時間15分くらい

http://satoshi.blogs.com/life/2012/12/ryan-dahl.html

 

JavaScript は Node.js の最新バージョンに使われているものを前提としてください(←ヒント)。

とあるがもっと簡単にできるのかな?とりあえず何も考えずに書いてみた。

 

var http = require('http');
function get(callback){
    var opt = {
        host: 'ichart.finance.yahoo.com',
        port: 80,
        path: '/table.csv?s=AAPL&a=11&b=1&c=2007&d=12&e=1&f=2012&g=m&ignore=.csv',
        method: 'GET',
        agent: new http.Agent({maxSockets: 1})
    };
    var req = http.request(opt, function(res) {
        var data = '';
        res.on('data', function(chunk) {
            data += chunk;
        });
        res.on('end', function() {
            callback(parsecsv(data));
        });
    });
    req.end();
}

function parsecsv(data){
    var begin = 1;
    var count = 0;
    var header = [ ];
    var table = [ ];
    data.toString().split('\n').forEach(function(line){
        if(line !== ''){
            var n = 0;
            var obj = {};
            line.split(',').forEach(function(col){
                if(count >= begin){
                    if(n === 0){
                        obj[header[n]] = col;
                    }else{
                        obj[header[n]] = parseFloat(col);
                    }
                    table.push(obj);
                }else{
                    header.push(col);
                }
                ++n;
            });
        }
        ++count;
    });
    return table;
}

get(function(table){
    // 最終結果表示
    console.log(table);
});

#はてなブログってトラックバックないのか?

ストリーム型通信でプログラマが知らなければいけないこと

基本は3つしかない。

これはバイナリだろうがテキストだろうが同じ。

 

・バッファリング

 一回の受信ではデータが揃わないのでデータが解読できるまで貯めておくこと。

・ディスパッチ

 データを解読してイベント処理を発行すること。

・イベント

 イベント処理を受け取って必要な処理を行うこと。

 

 

■バッファリング

 ストリーム型のデータには切れ目がない

 だから送信時に切れ目を認識できるようにする

 送信時には先頭にパケットデータサイズを入れておく

 データが到着したらパケットデータサイズをまず確認して

 自身が管理している受信可能最大値と比較して超えていたらドロップする

 

 問題がなければパケットデータサイズ分データが貯まるまでバッファリングする

 

■ディスパッチ

 3つの工程がある

 

 ・解析

  パケットデータサイズ分のデータがたまったら解析処理を行う。

  大抵がパケットサイズのあとに何を処理するかの種別データを埋め込んでおき

  種別データを元にイベントを発行する。

 

 ・データ組立

  なんのイベントかわかったらデータの組立処理を行う。

  足りないデータなどがあればそれはおかしなパケット。

 

 ・イベント発行

  イベント処理用の関数に組み立てたデータを入れて呼び出す。

 

■イベント

 ここまで来たらなんの目的の処理かわかるので処理するだけ。

 

 

例:

パケットサイズ;イベント1;データ1;パケットサイズ;イベント2;データ2;パケットサイズ;イベント3;データ3;

 

nodejsで実行時にスクリプトファイルを読み込んで実行する

C++などでluaを使ってよくやるスクリプトシステムと同等の仕組みを意味があるか別としてやってみた。

new Functionを使うと簡単かつJITが効く速いコードができる。

逆にこういう用途に使うであろうvmモジュールはくっそ遅い上にunstableなので使いにくい

var fs = require('fs');
var txt = fs.readFileSync('./filevm.jss');
var MAX = 1000000;
[function(){
    var TID = 'newFunction';
    var ctx = {
        hoge : 0,
        fuga : 0,
    };
    var f = new Function('"use strict";'+txt);
    var x = f();
    console.time(TID);
    try{
        x.init(ctx);
        for(var i=0;i<MAX;++i){
            x.update(ctx);
        }
    }catch(e){
        console.log(e.stack);
    }
    console.timeEnd(TID);
    console.log(ctx.hoge);
    console.log(ctx.fuga);
}].forEach(function(f){
    f();
});

スクリプト側

function init(ctx){
    ctx.hoge = 0;
    ctx.fuga = 0;
}
function update(ctx){
    ctx.hoge+=1;
    if(ctx.hoge%2===0){
     ctx.fuga+=1;
    }
}
return {
    init : init,
    update : update,
};

100万回実行して13ms

newFunction: 13ms

js側で関数やオブジェクト作ってctxに突っ込んでスクリプト側で実行もできる。

この実装方法であればnode.jsを再起動(接続中のユーザーが切断されずに)しなくてもスクリプト部分だけ再読込して実行できる

東京node学園祭2012参加してきました

東京node学園祭2012参加してきました

イントロダクション

基調講演
New Readable Stream in Node 0.10

Nodeコアの歩き方
~Nodeの開発に参加しよう~

Running Node.js in Production

layering distributed systems

ECMAScript tools - composable modules and transpiler infrastructure

 

全体として自分は英語のリスニングができないので通訳が大変よかったと感じました。

基調講演ではnode.js 1.0はもう少し先で0.10がもうすぐ出るとのこと。
自分は0.6をようやくアップデートして0.8を使うことにしたばかりなので
はやいなぁと。
package.jsonで依存関係ちゃんとやっとかないとまた動かなくなるのが出そう。
(NPMはnodeのバージョン関係なく最新版とってきてしまうので)
 
nodeコアの歩き方はドキュメントには書いてないnodeの仕組みでどこからみていったらよいかのとっかかりを紹介しいてた
自分もC++のソースは読んでいるがまだ全部把握してるわけじゃないので参考になった
大津さんの講演は前回のprocess.nextTickも大変参考になったし当分ウォッチさせていただこうと思っている。
 
Running Node.js in Productionはjitsuのceoの人でした
プロダクションレベルで運用するノウハウを講演してました
メモリリークは僕が前に書いたようにイベントリスナーには気をつけろとのことでした
npmのレプリケーションでプライベートnpmについても話していました
 
layering distributed systemsはsubstackの人で達人級の人が持ってる哲学をやってそうな人でした。
ストリームのプログラムをライブプログラミングでやってたのがとても印象的。
ゴシッププロトコルのところでチラチラ動かしてたMMOみたいなゲーム画面はどうなったんだろう
 
ECMAScript Toolsは自分も少し触ってみようかと思ったくらい面白そうでした

 

ECMAScriptがWEBのアセンブラのような位置づけになりそうです。

LLVM、CLRJVMECMAScriptサーバー/クライアント/OS問わず激しいシェア闘いがありそうな予感

 

あとで見てないセッションのUSTREAMの録画をみてみようとおもいます

 

Mikeal Rogersさんのやつがtweetみるとおもしろそうでした

 

http://www.ustream.tv/channel/nodefest2012a