2

私は Prevayler と協力して、非常に簡単なストレス テストを行っています。

私のプログラムでは、500 ミリ秒で 10,000 回の読み取りを取得できますが、1 つのオブジェクトの書き込みまたは変更には 23 ミリ秒かかります。(このコンピューターの詳細な仕様はありません。印象的なものはありません。デュアルコア 3.0GHz、7200rpm HD、およびおそらく 1333MHz ddr3 メモリです。)

シリアル化がボトルネックのようです。

書き込み/変更のパフォーマンスを向上させるために何ができますか?

JProfiler JProfiler でプログラムを実行しました (10,000 個のユーザー オブジェクトがディスクに書き込まれました)。250 秒間実行され、その時間の 99.6% が org.implementation.PrevaylerImpl.execute の実行に使用されました。

更新 XStreamSerializer に切り替えました。これにより、書き込み速度が書き込みあたり 21 ミリ秒に向上し、ストレージが

3555KB ジャーナル/10,000 オブジェクト -> 2421KB

350KB スナップショット/10,000 オブジェクト -> 313KB

1 秒あたり 1000 回以上の書き込みを見たいです。

---- Main Method ----

Transactor trans = new Transactor();

    for(int i =0;i<10000;i++)
    {
       trans.createUser("Username", "PasswordHash");
    }  


---- Transactor Class ----

public void createUser(String Username, String PasswordHash) {    

    String id = Helper.randomID();

    //Avoids id duplicates, id is 7 digit base58. (Like Bitcoin, but shorter.)
    //ID generation takes .0078ms.
    while(getUser(id)!=null)
    {
        id=Helper.randomID();
    }

    prevayler.execute(new CreateUser(Username, PasswordHash,id));
}


---- CreateUser Class ----

public class CreateUser implements Transaction, Serializable{

    String Username;
    String PasswordHash;
    String id;

    public  CreateUser(String Username, String PasswordHash, String id)
    {
        this.Username = Username;
        this.PasswordHash = PasswordHash;
        this.id = id;
    }

    public void executeOn(Object core,Date date) {
          ((Core)core).store(new User(Username, PasswordHash), id);
    }
}


---- Core Class (Store method) ----

private final Map<String,Object> dataMap = new HashMap<String,Object>();

public void store(Object object, String id) {

    dataMap.put(id, object);

    //Adds User id to a seperate ArrayList<String>
    if(object instanceof User )
    {
      userList.add(id);
    }
}
4

2 に答える 2

3

23 ミリ秒は、回転する 1 つのディスクに適しています。Disc Sync を使用すると、ファイルが開かれ、トランザクションがログに記録され、ディスクにフラッシュされ、ファイルが閉じられると思います。そのためにディスク ヘッドを移動する必要がある場合 (たとえば、ディレクトリ情報を更新する場合)、そのような時間を調べます。ディスクのセクターへのランダム アクセスは約 20 ミリ秒で、おそらくハイエンド ドライブの半分です。

多くの場合、1 秒間に 10 回だけディスクにフラッシュする方がよいでしょう。そうすれば、ディスク セクタが複数のトランザクションを保持するのに十分な大きさであり、ディスクが連続したデータ (つまりログ) を書き込むのに非常に優れていることを利用できます。

于 2014-01-27T12:53:23.700 に答える
1

ディスク同期をオフにしました (デフォルトでオンになっています)。現在、このコンピューターで毎秒 2500 回の書き込みが行われています。SSD を使用すると、1 秒あたり 10,000 回の書き込みが行われました。(読み取りもはるかに高速です。)それは私にとってはうまくいきますが、なぜディスク同期がそれほど遅くなるのかわかりません。誰かがそれについて話すことができますか?

public Transactor() {

    if (prevayler == null) {
        try {

            PrevaylerFactory<Core> factory = new PrevaylerFactory<Core>();
            factory.configurePrevalentSystem(new Core());

            //This
            factory.configureJournalDiskSync(false);

            factory.configureJournalSerializer("Journal",new XStreamSerializer());
            prevayler = factory.create();
...
于 2013-08-21T12:13:05.077 に答える