8

私たちはdb4o(http://www.db4o.comのOO-DBMS )を評価しています。クライアント/サーバーモードのパフォーマンステストをまとめました。サーバーを起動してから、一度に複数のクライアントでハンマーで叩きます。サーバーは一度に1つのクライアントのクエリしか処理できないようです。

このシナリオを可能にする構成スイッチをどこかで見逃したことがありますか?サーバーの実装は以下のとおりです。クライアントは、操作ごとに接続、クエリ(読み取り専用)、および切断を行い、操作はクライアントプロセス内の複数のワーカースレッドから次々に実行されます。同じサーバーに対してそれぞれ1人のワーカーで1つのクライアントプロセスを起動した場合も、同じ動作が見られます。

助言がありますか?

編集:LazyおよびSnapshot QueryModesを発見して試してみました。これにより、サーバーのブロックの問題が(部分的に)軽減されますが、クライアント(1を待機する40の同時テストクライアントを実行)では、重大な同時実行の問題が発生します。 -サーバーでランダム操作要求)ハンマーを発行する前の300ms。LINQプロバイダーおよびIO内部から発生する例外があるようです:-(

public class Db4oServer : ServerConfiguration, IMessageRecipient
{
    private bool stop;

    #region IMessageRecipient Members

    public void ProcessMessage(IMessageContext con, object message)
    {
        if (message is StopDb4oServer)
        {
            Close();
        }
    }

    #endregion

    public static void Main(string[] args)
    {
        //Ingestion.Do();
        new Db4oServer().Run(true, true);
    }

    public void Run(bool shouldIndex, bool shouldOptimizeNativeQueries)
    {
        lock (this)
        {
            var cfg = Db4oFactory.NewConfiguration();
            if (shouldIndex)
            {
                cfg.ObjectClass(typeof (Sequence))
                               .ObjectField("<ChannelID>k__BackingField")
                               .Indexed(true);
                cfg.ObjectClass(typeof (Vlip))
                               .ObjectField("<ChannelID>k__BackingField")
                               .Indexed(true);
            }
            if (shouldOptimizeNativeQueries)
            {
                cfg.OptimizeNativeQueries(true);
            }

            var server = Db4oFactory.OpenServer(cfg, FILE, PORT);
            server.GrantAccess("0", "kieran");
            server.GrantAccess("1", "kieran");
            server.GrantAccess("2", "kieran");
            server.GrantAccess("3", "kieran");
            //server.Ext().Configure().ClientServer().SingleThreadedClient(false);
            server.Ext().Configure().MessageLevel(3);
            server.Ext().Configure().Diagnostic().AddListener(new DiagnosticToConsole());
            server.Ext().Configure().ClientServer().SetMessageRecipient(this);
            try
            {
                if (!stop)
                {
                    Monitor.Wait(this);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            server.Close();
        }
    }

    public void Close()
    {
        lock (this)
        {
            stop = true;
            Monitor.PulseAll(this);
        }
    }
}
4

1 に答える 1