you21979の日記

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

リアルタイムサーバーでのリソース管理

nodejsで大量のオブジェクトを管理する方法

WEB系のPHPerの人は意外にしらないようなので普通のサーバーアプリケーションのリソース管理方法を記載してみる

下のようにシングルトンのマネージャを作成しマネージャ経由でオブジェクトを生成する

削除もマネージャ経由でやる

この方法だと10000個くらいは管理できる

100000個以上管理するなら自前でハッシュを実装したほうが幸せかも

なぜならdeleteのとき100000個中の一個消すとくっそ遅いから。

var util = require('util');
var events = require('events');
var cls = function(){
    this.n = 0;
    this.h = {};
};
util.inherits(cls, events.EventEmitter);
cls.prototype.fire = function(){
    this.emit('fire');
};
cls.prototype.create = function(){
    var w = new X(++this.n);
    this.h[w.id] = w;
    return w;
};
cls.prototype.delete = function(w){
    delete this.h[w.id];
    w.finalize();
};
cls.prototype.lookup = function(id){
    return this.h[id];
};
var Singleton = (function(){
    var instance = null;
    var getInstance = function(){
        if(instance !== null){
            return instance;
        }
        instance = new cls();
        instance.setMaxListeners(10000);
        return instance;
    };
    return {
        instance : getInstance,
    };
})();
var X = function(id){
    this.initialize(id);
};
X.prototype = {
    initialize : function(id){
        this.id = id;
        this.cb = function(){
            console.log("hoge %d",this.id);
        }.bind(this);
        Singleton.instance().on('fire',this.cb);
    },
    finalize : function(){
        Singleton.instance().removeListener('fire',this.cb);
    },
};
var w = Singleton.instance().create();
var p = Singleton.instance().lookup(w.id);
Singleton.instance().delete(p);

※lookupいらないならハッシュで管理する必要ないけどサーバだとあったほうが便利。

サーバーまたぐときIDベースでやり取りできるし。

関数型慣れてきた

というか

オブジェクト指向言語オブジェクト指向じゃないものが

だいたい関数型パラダイムなんだなぁ

C言語のマクロとかで関数合成みたいのやってたし

ファイバーとかマイクロスレッドとかの継続はモナドの一種だし

デザインパターンモナドだし

 

オブジェクト指向でやってる人がストラテジパターンとか拒否反応示す人いたりするし

そういった場合は関数型のパラダイムでもあったりするだなぁ

 

node.js

node.js触ってて職業プログラマが仕事で触るにはまだ早いかもなぁと思ってしまう。

 

以下の2つを何かの言語で習得してないならnode.jsはきついと思う

リアルタイムプログラミング

ネットワークプログラミング

 

オンラインゲームを支える技術を読んで理解できるなら

node.jsの習得に必要な技術を持ってることになる

オンラインゲームを支える技術  ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)

オンラインゲームを支える技術  ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)

 

これとjavascript勉強すればnode.jsが自動的に使えるようになる。

JavaScript 第6版

JavaScript 第6版

 

オンラインゲームを支える技術が理解できないなら今はまだきついと思う。

(リアルタイム通信フレームワークがないので)

 

まあ、こんなどうでもいいこと書いたのは単にamazonの商品紹介機能がはてなブログにあったから試してみたかっただけなんだけども。

 

KVMでデスクトップ仮想化でやったことリスト

UBUNTU12.04の場合

grub

 kernelパラメータの設定

  IOMMUを使えるようにする

  /etc/default/grub

  GRUB_CMDLINE_LINUX="amd_iommu=on iommu=on,pt,noaperture pass-through"

kvm

 /etc/modprobe.d/kvm.conf

 options kvm allow_unsafe_assigned_interrupts=1

・modprobe

 modprobe kvm

 modprobe kvm_amd

 問題ないなら

 /etc/modulesに

 kvm

 kvm_amd

 を追加

 pci_stubがなければそれも追加

・virsh

 virt-managerからできない機能が多いのでいろいろ手動設定

  VMVGAがKVM-SPICEで使えないのでKVMに変更(VMVGAが使えないと糞遅い)

  仮想マシンのバージョンがKVMのほうが古いので下げる

  RAWディスクをマッピング

・準仮想化ドライバのダウンロードとゲストへのインストール

 VirtIO

  http://www.linux-kvm.org/page/WindowsGuestDrivers/Download_Drivers

 VMWARE VGAドライバ

  http://www.linux-kvm.com/content/using-vmware-vga-kvm-windows-guests

virt-manager

 PCIパススルー

 VMの起動

 

 ※追記

ubuntu12.04のKVMはPCIパススルーするときにlspciとかでデバイス一覧だして

スタブドライバに登録する必要はなくなってて

virt-managerで一覧から選んでポチポチやれば簡単にパススルーできるようになってる

 

GPUパススルーでディアルディスプレイ使うならUSBで二台キーボードとマウスつなげてパススルーするか

synergy使って共有するかなんか考えるしかない

synergy使う場合はiptablesでパケット通さないとならんけど

そういやubuntuiptablesいじったことないんだけど正式な手順あるのだろうか。

自分はめんどくさいかなとおもって余ってたキーボードとマウスつけた

 

※追記2

dmesgでAGPのエラーでてたのでカーネルパラメータ直した

不安定な場合はGRUBのパラメータ微調整する

症状はGPUパススルーが一度は大丈夫だがwindowsを再起動すると二度目でBSODがでるなど。

KVMでデスクトップ仮想化

f:id:you21979:20121126190130p:plain

esxiのデスクトップ仮想化がうまくいかなかったのでKVMで。

XENからの移行なのでXENとあまりやり方かわらない)

 

CPU AMD-FX 8120

MEM16G

MOTHER ASROCK990FX EXTREME4

RADEON 4350

RADEON 6570

 

・あきらめ 

PCIデバイスのパススルーとマザボオンボードSATAのパススルーはできないのがわかったのであきらめた

(チップセットのSATAとは別にもう一個積んでる方がパススルーできない)

 

・DXVAの問題

やはりGPUパススルーしたときにDXVAがうまくいかない

EVRで出力するとノイズがのり再生速度も紙芝居になる

VMR9なら問題ない。

 

・ゲーム

ブラウザゲームとかやると結構重い

 

・サウンド

USBのサウンドをUSBパススルーで普通にいけた

 

・ホスト

UBUNTU12.04

・ゲスト

FREENAS

 ZFSのファイルサーバー

 パススルー:なし(RDMでHDD3Tディスクをマッピング)

WINDOWS7

 デスクトップ

 パススルー:RADEON 6570

 パススルー:USB3

WINDOWSXP

 録画サーバー

UBUNTU12.04

 プログラミング環境

 パススルー:なし

 

*追記

grubのパラメータの指定が間違えていたようだ

GRUB_CMDLINE_LINUX_DEFAULT="IOMMU=pt IOMMU=1"

↑をGRUB_CMDLINE_LINUXに書いてたからパラメータ読み込まれてなかった

これを直したらdmsgにIOMMUのPAGEエラーが出てたのが消えた

 AMD IOMMU: Event logged [IO_PAGE_FAULT device

 

DXVAのエラーはこれで直った

 

しかし、IOMMUを設定しなくてもDXVA以外は一応うまくパススルーできてたのが謎

 

これで以下の3つこなしてたWINDOWSサーバーが引退できる

録画サーバー

ファイルサーバー

VMWARE-SERVER