Also one other thing to check is the JVM settings. Do you mind sharing that
as well?

Sijie

On Jul 10, 2017 1:17 AM, "Sijie Guo" <guosi...@gmail.com> wrote:

> I am not sure if there is any default values changed for journal settings.
> I would suggest you testing by setting specifically the journal settings.
>
> Also if you can share your benchmark, that would be good for other people
> to verify.
>
> Sijie
>
> On Jul 10, 2017 12:32 AM, "Enrico Olivelli" <eolive...@gmail.com> wrote:
>
>> Hi,
>> I am doing some benchmarks on BK, I see that from 4.4.0 to 4.5.0 there is
>> something "slow" but I cannot understand what. I really hope that I am
>> wrong.
>>
>> I am working with writes, I will pass to reads once writes will be ok.
>> My problem is both on latency (time for AddComplete callback to complete)
>> and on overall throuput.
>>
>> Actually I have two distinct problems, but working on the first problem I
>> found a performance regression.
>> I know that talking about "slow" things it is an hard matter, so I will
>> try
>> do describe as much as possible all the aspects that I think are relevant.
>>
>> First problem: under certain load performance (latency+throughput) degrade
>> too much
>> Second problem: the first problem is more evident in 4.5.0
>>
>> Let's describe my testcase and why I am worried.
>> The bench issues a batch of asyncAddEntry and prints the average time for
>> AddComplete to complete and the overall clock time.
>>
>> This is the code
>>
>> private static final byte[] TEST_DATA = new byte[35 * 1024];
>> private static final int testsize = 1000;
>>
>> ...... (start 1 bookie, see below)
>>             ClientConfiguration clientConfiguration = new
>> ClientConfiguration();
>>             clientConfiguration.setZkServers(env.getAddress());
>>             try (BookKeeper bk = new BookKeeper(clientConfiguration);
>>                 LedgerHandle lh = bk.createLedger(1, 1, 1,
>> BookKeeper.DigestType.CRC32, new byte[0])) {
>>                 LongAdder totalTime = new LongAdder();
>>                 long _start = System.currentTimeMillis();
>>                 Collection<CompletableFuture> batch = new
>> ConcurrentLinkedQueue<>();
>>                 for (int i = 0; i < testsize; i++) {
>>                     CompletableFuture cf = new CompletableFuture();
>>                     batch.add(cf);
>>                     lh.asyncAddEntry(TEST_DATA, new
>> AsyncCallback.AddCallback() {
>>
>>                         long start = System.currentTimeMillis();
>>
>>                         @Override
>>                         public void addComplete(int rc, LedgerHandle lh,
>> long entryId, Object ctx) {
>>                             long now =
>> System.currentTimeMillis();
>>                             CompletableFuture _cf = (CompletableFuture)
>> ctx;
>>                             if (rc == BKException.Code.OK) {
>>                                 _cf.complete("");
>>                             } else {
>>
>> _cf.completeExceptionally(BKException.create(rc));
>>                             }
>>                             totalTime.add(now - start);
>>                         }
>>                     }, cf);
>> //                    Thread.sleep(1);      // this is the tirgger!!!
>>                 }
>>                 assertEquals(testsize, batch.size());
>>                 for (CompletableFuture f : batch) {
>>                     f.get();
>>                 }
>>                 long _stop = System.currentTimeMillis();
>>                 long delta = _stop - _start;
>>                 System.out.println("Total time: " + delta + " ms");
>>                 System.out.println("Total real time: " + totalTime.sum() +
>> " ms -> "+(totalTime.sum()/testsize)+" ms per entry");
>>             }
>>
>> Bookie config:
>>         ServerConfiguration conf = new ServerConfiguration();
>>         conf.setBookiePort(5621);
>>         conf.setUseHostNameAsBookieID(true);
>>
>>         Path targetDir = path.resolve("bookie_data");
>>         conf.setZkServers("localhost:1282");
>>         conf.setLedgerDirNames(new
>> String[]{targetDir.toAbsolutePath().toString()});
>>         conf.setJournalDirName(targetDir.toAbsolutePath().toString());
>>         conf.setFlushInterval(1000);
>>         conf.setJournalFlushWhenQueueEmpty(true);
>>         conf.setProperty("journalMaxGroupWaitMSec", 0);
>>         conf.setProperty("journalBufferedWritesThreshold", 1024);
>>         conf.setAutoRecoveryDaemonEnabled(false);
>>         conf.setEnableLocalTransport(true);
>>         conf.setAllowLoopback(true);
>>
>> The tests starts one ZK server + 1 Bookie + the testcase in a JUnit test
>>
>>
>> Results:
>> A - BK-4.4.0:
>> Total time: 209 ms
>> Total real time: 194337 ms -> 194 ms per entry
>>
>> B - BK-4.5.0-SNAPSHOT:
>> Total time: 269 ms
>> Total real time: 239918 ms -> 239 ms per entry
>>
>> C - BK-4.4,0 with sleep(1):
>> Total time: 1113 ms (1000 ms sleep time)
>> Total real time: 4238 ms  -> 4 ms per entry
>>
>> D - BK-4.5,0-SNAPSHOT with sleep(1):
>> Total time: 1121 ms (1000 ms sleep time)
>> Total real time: 8018 ms -> 8 ms per entry
>>
>> Problem 1 (unexpected performance degradation):
>> Times per entry (latency) are incredibly slow in cases A and B.
>> If I add a sleep(1) between one call of asyncAddEntry and the next
>> "latency" is around 4 ms per entry.
>>
>> Problem 2: worse performance on 4.5.0
>> Compare A vs B and C vs D, it is self-explaining.
>>
>> I am running the test on my laptop, with linux 64bit (Fedora), 12 GB RAM,
>> no swap, on an SSD disk. The results are similar on other computers.
>>
>> It seems that if I issue too many addEntry the systems slows down.
>>
>> Please note this fact:
>> numbers for case A and B (without sleep) mean that all the adds got
>> completed almost together
>>
>> for the 4.5 vs 4.4 case:
>> I tried to disable all of the threadpool enhancements (different
>> read/write
>> pools)....it makes not difference
>>
>> Questions:
>>
>> Is the "grouping" logic of the journal ?
>>
>> Is there a way of making a burst of 1000 async writes on the same ledger
>> perform <10 ms latency ?  (in my real case I have bursts of concurrent
>> writes from different threads)
>>
>> Why 4.5.0 is anyway slower ?
>>
>> Thanks
>>
>> -- Enrico
>>
>

Reply via email to