You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ji...@apache.org on 2019/10/31 02:05:53 UTC

[incubator-iotdb] branch dev_new_merge_strategy updated: add chunk provider

This is an automated email from the ASF dual-hosted git repository.

jiangtian pushed a commit to branch dev_new_merge_strategy
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git


The following commit(s) were added to refs/heads/dev_new_merge_strategy by this push:
     new 3fd9a87  add chunk provider
3fd9a87 is described below

commit 3fd9a87660f96c91814d518238112d6333a8bcea
Author: jt <jt...@163.com>
AuthorDate: Thu Oct 31 10:05:24 2019 +0800

    add chunk provider
---
 .../merge/inplace/task/MergeMultiChunkTask.java    |  27 ++++--
 .../iotdb/db/engine/merge/util/ChunkProvider.java  |  36 +++++++
 .../engine/merge/util/ChunkProviderExecutor.java   |  68 +++++++++++++
 .../db/engine/merge/util/DirectChunkProvider.java  |  46 +++++++++
 .../engine/merge/util/SharedMapChunkProvider.java  | 102 +++++++++++++++++++
 .../merge/util/SharedQueueChunkProvider.java       | 108 +++++++++++++++++++++
 .../java/org/apache/iotdb/db/service/IoTDB.java    |   2 +
 .../org/apache/iotdb/db/service/ServiceType.java   |   3 +-
 .../db/engine/merge/inplace/MergePerfTest.java     |   9 +-
 server/src/test/resources/logback.xml              |   4 +-
 10 files changed, 392 insertions(+), 13 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/engine/merge/inplace/task/MergeMultiChunkTask.java b/server/src/main/java/org/apache/iotdb/db/engine/merge/inplace/task/MergeMultiChunkTask.java
index 1d6b222..1421ef3 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/merge/inplace/task/MergeMultiChunkTask.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/merge/inplace/task/MergeMultiChunkTask.java
@@ -27,6 +27,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.PriorityQueue;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
@@ -38,6 +39,10 @@ import org.apache.iotdb.db.engine.merge.manage.MergeResource;
 import org.apache.iotdb.db.engine.merge.inplace.recover.InplaceMergeLogger;
 import org.apache.iotdb.db.engine.merge.IMergePathSelector;
 import org.apache.iotdb.db.engine.merge.NaivePathSelector;
+import org.apache.iotdb.db.engine.merge.util.ChunkProvider;
+import org.apache.iotdb.db.engine.merge.util.DirectChunkProvider;
+import org.apache.iotdb.db.engine.merge.util.SharedMapChunkProvider;
+import org.apache.iotdb.db.engine.merge.util.SharedQueueChunkProvider;
 import org.apache.iotdb.db.engine.modification.Modification;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.query.reader.IPointReader;
@@ -236,6 +241,7 @@ class MergeMultiChunkTask {
       idx++;
       ptWrittens[i] = 0;
     }
+    ChunkProvider provider = new DirectChunkProvider(reader);
 
     mergedChunkNum.set(0);
     unmergedChunkNum.set(0);
@@ -244,8 +250,8 @@ class MergeMultiChunkTask {
     for (int i = 0; i < mergeChunkSubTaskNum; i++) {
       int finalI = i;
       futures.add(MergeManager.getINSTANCE().submitChunkSubTask(() -> {
-        mergeChunkHeap(chunkMetaHeaps[finalI], ptWrittens, reader, mergeFileWriter, unseqReaders, currFile,
-            isLastFile);
+        mergeChunkHeap(chunkMetaHeaps[finalI], ptWrittens, provider, mergeFileWriter, unseqReaders,
+            currFile, isLastFile);
         return null;
       }));
     }
@@ -266,9 +272,10 @@ class MergeMultiChunkTask {
     return mergedChunkNum.get() > 0;
   }
 
-  private void mergeChunkHeap(PriorityQueue<MetaListEntry> chunkMetaHeap, int[] ptWrittens, TsFileSequenceReader reader,
-                              RestorableTsFileIOWriter mergeFileWriter, IPointReader[] unseqReaders, TsFileResource currFile,
-                              boolean isLastFile) throws IOException {
+  private void mergeChunkHeap(PriorityQueue<MetaListEntry> chunkMetaHeap, int[] ptWrittens,
+      ChunkProvider provider, RestorableTsFileIOWriter mergeFileWriter, IPointReader[] unseqReaders,
+      TsFileResource currFile,
+      boolean isLastFile) throws IOException {
     while (!chunkMetaHeap.isEmpty()) {
       MetaListEntry metaListEntry = chunkMetaHeap.poll();
       ChunkMetaData currMeta = metaListEntry.current();
@@ -280,12 +287,15 @@ class MergeMultiChunkTask {
 
       boolean chunkOverflowed = MergeUtils.isChunkOverflowed(currTimeValuePairs[pathIdx], currMeta);
       boolean chunkTooSmall = MergeUtils
-              .isChunkTooSmall(ptWrittens[pathIdx], currMeta, isLastChunk, minChunkPointNum);
+          .isChunkTooSmall(ptWrittens[pathIdx], currMeta, isLastChunk, minChunkPointNum);
 
       Chunk chunk;
-      synchronized (reader) {
-        chunk = reader.readMemChunk(currMeta);
+      try {
+        chunk = provider.require(currMeta);
+      } catch (InterruptedException e) {
+        throw new IOException("Interrupted when reading a chunk", e);
       }
+
       ptWrittens[pathIdx] = mergeChunkV2(currMeta, chunkOverflowed, chunkTooSmall, chunk,
               ptWrittens[pathIdx], pathIdx, mergeFileWriter, unseqReaders[pathIdx], chunkWriter,
               currFile);
@@ -377,6 +387,7 @@ class MergeMultiChunkTask {
       // the new chunk's size is large enough and it should be flushed
       synchronized (mergeFileWriter) {
         chunkWriter.writeToFileWriter(mergeFileWriter);
+        mergeContext.incTotalChunkWritten();
       }
       unclosedChunkPoint = 0;
     }
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/merge/util/ChunkProvider.java b/server/src/main/java/org/apache/iotdb/db/engine/merge/util/ChunkProvider.java
new file mode 100644
index 0000000..4f6c7ba
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/engine/merge/util/ChunkProvider.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.engine.merge.util;
+
+import java.io.IOException;
+import org.apache.iotdb.tsfile.file.metadata.ChunkMetaData;
+import org.apache.iotdb.tsfile.read.common.Chunk;
+
+public interface ChunkProvider {
+
+  /**
+   * Require a chunk corresponding meta from this provider. This method will block until
+   * the chunk is read.
+   * @param metaData
+   * @return
+   * @throws InterruptedException
+   */
+  Chunk require(ChunkMetaData metaData) throws InterruptedException, IOException;
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/merge/util/ChunkProviderExecutor.java b/server/src/main/java/org/apache/iotdb/db/engine/merge/util/ChunkProviderExecutor.java
new file mode 100644
index 0000000..b8b9987
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/engine/merge/util/ChunkProviderExecutor.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.engine.merge.util;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import org.apache.iotdb.db.exception.StartupException;
+import org.apache.iotdb.db.service.IService;
+import org.apache.iotdb.db.service.ServiceType;
+
+public class ChunkProviderExecutor implements IService {
+
+  private static ChunkProviderExecutor INSTANCE = new ChunkProviderExecutor();
+
+  private ExecutorService providerThreadPool =
+      Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
+
+  private ChunkProviderExecutor() {
+  }
+
+  public static ChunkProviderExecutor getINSTANCE() {
+    return INSTANCE;
+  }
+
+  void submit(Callable providerTask) {
+    providerThreadPool.submit(providerTask);
+  }
+
+  public void close() {
+    providerThreadPool.shutdownNow();
+    while (!providerThreadPool.isTerminated()) {
+      // wait
+    }
+  }
+
+  @Override
+  public void start() throws StartupException {
+
+  }
+
+  @Override
+  public void stop() {
+    close();
+  }
+
+  @Override
+  public ServiceType getID() {
+    return ServiceType.CHUNK_PROVIDER_SERVICE;
+  }
+}
\ No newline at end of file
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/merge/util/DirectChunkProvider.java b/server/src/main/java/org/apache/iotdb/db/engine/merge/util/DirectChunkProvider.java
new file mode 100644
index 0000000..eb1c991
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/engine/merge/util/DirectChunkProvider.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.engine.merge.util;
+
+import java.io.IOException;
+import org.apache.iotdb.tsfile.file.metadata.ChunkMetaData;
+import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
+import org.apache.iotdb.tsfile.read.common.Chunk;
+
+/**
+ * DirectChunkProvider directly read the desired Chunk from a TsFileSequenceReader, using
+ * synchronized to provide thread safety.
+ * This class is for experiments in comparison with SharedQueueChunkProvider.
+ */
+public class DirectChunkProvider implements ChunkProvider {
+
+  private TsFileSequenceReader reader;
+
+  public DirectChunkProvider(TsFileSequenceReader reader) {
+    this.reader = reader;
+  }
+
+  @Override
+  public Chunk require(ChunkMetaData metaData) throws IOException {
+    synchronized (reader) {
+      return reader.readMemChunk(metaData);
+    }
+  }
+}
\ No newline at end of file
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/merge/util/SharedMapChunkProvider.java b/server/src/main/java/org/apache/iotdb/db/engine/merge/util/SharedMapChunkProvider.java
new file mode 100644
index 0000000..b21ffd2
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/engine/merge/util/SharedMapChunkProvider.java
@@ -0,0 +1,102 @@
+/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one
+ *  * or more contributor license agreements.  See the NOTICE file
+ *  * distributed with this work for additional information
+ *  * regarding copyright ownership.  The ASF licenses this file
+ *  * to you under the Apache License, Version 2.0 (the
+ *  * "License"); you may not use this file except in compliance
+ *  * with the License.  You may obtain a copy of the License at
+ *  *
+ *  *     http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing,
+ *  * software distributed under the License is distributed on an
+ *  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  * KIND, either express or implied.  See the License for the
+ *  * specific language governing permissions and limitations
+ *  * under the License.
+ *
+ */
+
+package org.apache.iotdb.db.engine.merge.util;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import org.apache.iotdb.tsfile.file.metadata.ChunkMetaData;
+import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
+import org.apache.iotdb.tsfile.read.common.Chunk;
+
+/**
+ * SharedQueueProvider read the Chunks by the order of their disk offsets and store them in a queue,
+ * which reduces random seeks.
+ */
+public class SharedMapChunkProvider implements ChunkProvider{
+
+  private static final int MAX_SIZE = 512;
+
+  private Map<ChunkMetaData, Chunk> map = new ConcurrentHashMap<>();
+  private List<ChunkMetaData> allChunkMetadataList;
+  private TsFileSequenceReader reader;
+
+  public SharedMapChunkProvider(List<ChunkMetaData>[] chunkMetadataLists, TsFileSequenceReader reader) {
+    allChunkMetadataList = new ArrayList<>();
+    for (List<ChunkMetaData> chunkMetaDataList : chunkMetadataLists) {
+      allChunkMetadataList.addAll(chunkMetaDataList);
+    }
+    allChunkMetadataList.sort(Comparator.comparing(ChunkMetaData::getOffsetOfChunkHeader));
+    this.reader = reader;
+    ChunkProviderExecutor.getINSTANCE().submit(new ProviderTask());
+  }
+
+
+  public Chunk require(ChunkMetaData chunkMetaData) throws InterruptedException {
+    while (true) {
+      synchronized (map) {
+        Chunk chunk = map.get(chunkMetaData);
+        if (chunk == null) {
+          // the queue is empty or the peek is not what we want, wait until a new entry is ready
+          map.wait();
+          continue;
+        }
+        // the entry contains what we want
+        map.remove(chunkMetaData);
+        // notify other appliers and the provider that the head is taken away
+        map.notifyAll();
+        return chunk;
+      }
+    }
+  }
+
+  private class ProviderTask implements Callable<Void> {
+
+    @Override
+    public Void call() throws Exception {
+      for (ChunkMetaData chunkMetaData : allChunkMetadataList) {
+        Chunk chunk = reader.readMemChunk(chunkMetaData);
+
+        synchronized (map) {
+          int size = map.size();
+          if (size >= MAX_SIZE) {
+            // wait until some entry is taken
+            map.wait();
+            map.put(chunkMetaData, chunk);
+            map.notifyAll();
+          } else {
+            // notify appliers that a new entry is available
+            map.put(chunkMetaData, chunk);
+            map.notifyAll();
+          }
+        }
+      }
+      return null;
+    }
+  }
+}
\ No newline at end of file
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/merge/util/SharedQueueChunkProvider.java b/server/src/main/java/org/apache/iotdb/db/engine/merge/util/SharedQueueChunkProvider.java
new file mode 100644
index 0000000..18ac34d
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/engine/merge/util/SharedQueueChunkProvider.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.engine.merge.util;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Deque;
+import java.util.List;
+import java.util.concurrent.Callable;
+import org.apache.iotdb.tsfile.file.metadata.ChunkMetaData;
+import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
+import org.apache.iotdb.tsfile.read.common.Chunk;
+
+/**
+ * SharedQueueProvider read the Chunks by the order of their disk offsets and store them in a queue,
+ * which reduces random seeks.
+ */
+public class SharedQueueChunkProvider implements ChunkProvider{
+
+  private static final int QUEUE_MAX_SIZE = 64;
+
+  private Deque<Entry> queue = new ArrayDeque<>();
+  private List<ChunkMetaData> allChunkMetadataList;
+  private TsFileSequenceReader reader;
+
+  public SharedQueueChunkProvider(List<ChunkMetaData>[] chunkMetadataLists, TsFileSequenceReader reader) {
+    allChunkMetadataList = new ArrayList<>();
+    for (List<ChunkMetaData> chunkMetaDataList : chunkMetadataLists) {
+      allChunkMetadataList.addAll(chunkMetaDataList);
+    }
+    allChunkMetadataList.sort(Comparator.comparing(ChunkMetaData::getOffsetOfChunkHeader));
+    this.reader = reader;
+    ChunkProviderExecutor.getINSTANCE().submit(new ProviderTask());
+  }
+
+
+  public Chunk require(ChunkMetaData chunkMetaData) throws InterruptedException {
+    while (true) {
+      synchronized (queue) {
+        Entry head = queue.peek();
+        if (head == null || head.meta != chunkMetaData) {
+          // the queue is empty or the peek is not what we want, wait until a new entry is ready
+          queue.wait();
+          continue;
+        }
+        // the entry contains what we want
+        queue.poll();
+        // notify other appliers and the provider that the head is taken away
+        queue.notifyAll();
+        return head.chunk;
+      }
+    }
+  }
+
+  private static class Entry {
+
+    Entry(ChunkMetaData meta, Chunk chunk) {
+      this.meta = meta;
+      this.chunk = chunk;
+    }
+
+    private ChunkMetaData meta;
+    private Chunk chunk;
+  }
+
+  private class ProviderTask implements Callable<Void> {
+
+    @Override
+    public Void call() throws Exception {
+      for (ChunkMetaData chunkMetaData : allChunkMetadataList) {
+        Chunk chunk = reader.readMemChunk(chunkMetaData);
+
+        synchronized (queue) {
+          int size = queue.size();
+          if (size >= QUEUE_MAX_SIZE) {
+            // wait until some entry is taken
+            queue.wait();
+            queue.addLast(new Entry(chunkMetaData, chunk));
+            queue.notifyAll();
+          } else {
+            queue.addLast(new Entry(chunkMetaData, chunk));
+            // notify appliers that a new entry is available
+            queue.notifyAll();
+          }
+        }
+      }
+      return null;
+    }
+  }
+}
\ No newline at end of file
diff --git a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
index 290efea..b874849 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
@@ -29,6 +29,7 @@ import org.apache.iotdb.db.engine.StorageEngine;
 import org.apache.iotdb.db.engine.cache.CacheHitRatioMonitor;
 import org.apache.iotdb.db.engine.merge.manage.MergeManager;
 import org.apache.iotdb.db.engine.flush.FlushManager;
+import org.apache.iotdb.db.engine.merge.util.ChunkProviderExecutor;
 import org.apache.iotdb.db.exception.StartupException;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.monitor.StatMonitor;
@@ -104,6 +105,7 @@ public class IoTDB implements IoTDBMBean {
     registerManager.register(MergeManager.getINSTANCE());
     registerManager.register(CacheHitRatioMonitor.getInstance());
     registerManager.register(MetricsService.getInstance());
+    registerManager.register(ChunkProviderExecutor.getINSTANCE());
     JMXService.registerMBean(getInstance(), mbeanName);
 
     logger.info("IoTDB is set up.");
diff --git a/server/src/main/java/org/apache/iotdb/db/service/ServiceType.java b/server/src/main/java/org/apache/iotdb/db/service/ServiceType.java
index e2cd8d4..20eb945 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/ServiceType.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/ServiceType.java
@@ -42,7 +42,8 @@ public enum ServiceType {
       generateJmxName(IoTDBConstant.IOTDB_PACKAGE, "Cache Hit Ratio")),
 
   FLUSH_SERVICE("Flush ServerService",
-      generateJmxName("org.apache.iotdb.db.engine.pool", "Flush Manager"));
+      generateJmxName("org.apache.iotdb.db.engine.pool", "Flush Manager")),
+  CHUNK_PROVIDER_SERVICE("Chunk provider service", "");
 
   private String name;
   private String jmxName;
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MergePerfTest.java b/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MergePerfTest.java
index 1508415..d51a665 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MergePerfTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MergePerfTest.java
@@ -27,6 +27,7 @@ import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.engine.merge.MergeTest;
 import org.apache.iotdb.db.engine.merge.manage.MergeResource;
 import org.apache.iotdb.db.engine.merge.inplace.task.InplaceMergeTask;
+import org.apache.iotdb.db.engine.merge.util.ChunkProviderExecutor;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 
@@ -39,6 +40,8 @@ public class MergePerfTest extends MergeTest {
     File tempSGDir = new File("tempSG");
     tempSGDir.mkdirs();
     setUp();
+    System.out.println("Files prepared.");
+
     long timeConsumption = System.currentTimeMillis();
     MergeResource resource = new MergeResource(seqResources, unseqResources);
     resource.setCacheDeviceMeta(true);
@@ -48,7 +51,9 @@ public class MergePerfTest extends MergeTest {
     mergeTask.call();
     timeConsumption = System.currentTimeMillis() - timeConsumption;
     tearDown();
+    ChunkProviderExecutor.getINSTANCE().close();
     FileUtils.deleteDirectory(tempSGDir);
+    System.out.println(timeConsumption);
   }
 
   public static void main(String[] args) throws Exception {
@@ -59,8 +64,8 @@ public class MergePerfTest extends MergeTest {
 
     perfTest.seqFileNum = 5;
     perfTest.unseqFileNum = 5;
-    perfTest.measurementNum = 100;
-    perfTest.deviceNum = 10;
+    perfTest.measurementNum = 10000;
+    perfTest.deviceNum = 1;
     perfTest.ptNum = 5000;
     perfTest.flushInterval = 1000;
     perfTest.fullMerge = true;
diff --git a/server/src/test/resources/logback.xml b/server/src/test/resources/logback.xml
index a4aa6da..d69e3b1 100644
--- a/server/src/test/resources/logback.xml
+++ b/server/src/test/resources/logback.xml
@@ -30,12 +30,12 @@
             <charset>utf-8</charset>
         </encoder>
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
-            <level>ERROR</level>
+            <level>INFO</level>
         </filter>
     </appender>
     <!--<logger name="org.apache.iotdb.db.utils.OpenFileNumUtil" level="debug" />-->
     <!--<logger name="org.apache.iotdb.db.utils.OpenFileNumUtilTest" level="debug" />-->
-    <root level="ERROR">
+    <root level="INFO">
         <appender-ref ref="stdout"/>
     </root>
 </configuration>