Return-Path: X-Original-To: apmail-cassandra-user-archive@www.apache.org Delivered-To: apmail-cassandra-user-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 1F78C106BF for ; Tue, 20 Aug 2013 23:06:58 +0000 (UTC) Received: (qmail 38879 invoked by uid 500); 20 Aug 2013 23:06:55 -0000 Delivered-To: apmail-cassandra-user-archive@cassandra.apache.org Received: (qmail 38850 invoked by uid 500); 20 Aug 2013 23:06:55 -0000 Mailing-List: contact user-help@cassandra.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@cassandra.apache.org Delivered-To: mailing list user@cassandra.apache.org Received: (qmail 38840 invoked by uid 99); 20 Aug 2013 23:06:55 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 20 Aug 2013 23:06:55 +0000 X-ASF-Spam-Status: No, hits=1.5 required=5.0 tests=HTML_MESSAGE,RCVD_IN_DNSWL_LOW X-Spam-Check-By: apache.org Received-SPF: error (athena.apache.org: local policy) Received: from [209.85.219.43] (HELO mail-oa0-f43.google.com) (209.85.219.43) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 20 Aug 2013 23:06:49 +0000 Received: by mail-oa0-f43.google.com with SMTP id i10so2118294oag.2 for ; Tue, 20 Aug 2013 16:06:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:content-type; bh=zNL76s16A56ymtWSlbqyrEWf56xNj7hJZzt82eOQJKM=; b=SzuR3FmT2oxu/Qf0OSC+bYGVLZyIUoqcnz4hhigNJNal92g0ffO0Or9iM3I8LYTyqs SUzm5p0iJTn8bdZhkDQnwBt2oNC11jCnwMIMl8cQzqiih3X38RNxRV/E+RqtSc+//xbX 0XnrHl4S++gMBzFcLu/kdAcs1WX4qY8ywreRP/BhCp81MVK+M9bSokaKTpDUg9rxRPJ/ FN2dbqu96VEHTOjunbIHUoMG+l276KJxQ2iWX2Di0DIvqKTogrjjmCMyvRlE39s2TTeH z0nHppFhoXe396RNF5vPF8hJPbK3Um4M8F+pJZPAcYG5C/BtJ1/cI2tM7CGrbafhbQ6x JG0A== X-Gm-Message-State: ALoCoQlM9nPkBjEFaOC1A40SDHTFS5e0HszR/+24vYd3xyvMqXkotiOrwpEj4PjgLm6vIyJsjzoI MIME-Version: 1.0 X-Received: by 10.182.81.41 with SMTP id w9mr4563808obx.18.1377039968083; Tue, 20 Aug 2013 16:06:08 -0700 (PDT) Received: by 10.76.170.7 with HTTP; Tue, 20 Aug 2013 16:06:08 -0700 (PDT) X-Originating-IP: [70.112.126.233] In-Reply-To: <5213E718.7030203@gmail.com> References: <5212A108.9050804@gmail.com> <5212D106.4050700@gmail.com> <5213757D.8030106@gmail.com> <5213E718.7030203@gmail.com> Date: Tue, 20 Aug 2013 18:06:08 -0500 Message-ID: Subject: Re: insert performance (1.2.8) From: Nate McCall To: user@cassandra.apache.org Content-Type: multipart/alternative; boundary=047d7b2e4d7c23b40204e4691a53 X-Virus-Checked: Checked by ClamAV on apache.org --047d7b2e4d7c23b40204e4691a53 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Ugh - sorry, I knew Sylvain and Micha=EBl had worked on this recently but i= t is only in 2.0 - I could have sworn it got marked for inclusion back into 1.2 but I was wrong: https://issues.apache.org/jira/browse/CASSANDRA-4693 This is indeed an issue if you don't know the column count before hand (or had a very large number of them like in your case). Again, apologies, I would not have recommended that route if I knew it was only in 2.0. I would be willing to bet you could hit those insert numbers pretty easily with thrift given the shape of your mutation. On Tue, Aug 20, 2013 at 5:00 PM, Keith Freeman <8forty@gmail.com> wrote: > So I tried inserting prepared statements separately (no batch), and my > server nodes load definitely dropped significantly. Throughput from my > client improved a bit, but only a few %. I was able to *almost* get 5000 > rows/sec (sort of) by also reducing the rows/insert-thread to 20-50 and > eliminating all overhead from the timing, i.e. timing only the tight for > loop of inserts. But that's still a lot slower than I expected. > > I couldn't do batches because the driver doesn't allow prepared statement= s > in a batch (QueryBuilder API). It appears the batch itself could possibl= y > be a prepared statement, but since I have 40+ columns on each insert that > would take some ugly code to build so I haven't tried it yet. > > I'm using CL "ONE" on the inserts and RF 2 in my schema. > > > On 08/20/2013 08:04 AM, Nate McCall wrote: > > John makes a good point re:prepared statements (I'd increase batch sizes > again once you did this as well - separate, incremental runs of course so > you can gauge the effect of each). That should take out some of the > processing overhead of statement validation in the server (some - that lo= ad > spike still seems high though). > > I'd actually be really interested as to what your results were after > doing so - i've not tried any A/B testing here for prepared statements on > inserts. > > Given your load is on the server, i'm not sure adding more async > indirection on the client would buy you too much though. > > Also, at what RF and consistency level are you writing? > > > On Tue, Aug 20, 2013 at 8:56 AM, Keith Freeman <8forty@gmail.com> wrote: > >> Ok, I'll try prepared statements. But while sending my statements >> async might speed up my client, it wouldn't improve throughput on the >> cassandra nodes would it? They're running at pretty high loads and only >> about 10% idle, so my concern is that they can't handle the data any >> faster, so something's wrong on the server side. I don't really think >> there's anything on the client side that matters for this problem. >> >> Of course I know there are obvious h/w things I can do to improve server >> performance: SSDs, more RAM, more cores, etc. But I thought the servers= I >> have would be able to handle more rows/sec than say Mysql, since write >> speed is supposed to be one of Cassandra's strengths. >> >> >> On 08/19/2013 09:03 PM, John Sanda wrote: >> >> I'd suggest using prepared statements that you initialize at application >> start up and switching to use Session.executeAsync coupled with Google >> Guava Futures API to get better throughput on the client side. >> >> >> On Mon, Aug 19, 2013 at 10:14 PM, Keith Freeman <8forty@gmail.com> wrote= : >> >>> Sure, I've tried different numbers for batches and threads, but >>> generally I'm running 10-30 threads at a time on the client, each sendi= ng a >>> batch of 100 insert statements in every call, using the >>> QueryBuilder.batch() API from the latest datastax java driver, then cal= ling >>> the Session.execute() function (synchronous) on the Batch. >>> >>> I can't post my code, but my client does this on each iteration: >>> -- divides up the set of inserts by the number of threads >>> -- stores the current time >>> -- tells all the threads to send their inserts >>> -- then when they've all returned checks the elapsed time >>> >>> At about 2000 rows for each iteration, 20 threads with 100 inserts each >>> finish in about 1 second. For 4000 rows, 40 threads with 100 inserts e= ach >>> finish in about 1.5 - 2 seconds, and as I said all 3 cassandra nodes ha= ve a >>> heavy CPU load while the client is hardly loaded. I've tried with 10 >>> threads and more inserts per batch, or up to 60 threads with fewer, doe= sn't >>> seem to make a lot of difference. >>> >>> >>> On 08/19/2013 05:00 PM, Nate McCall wrote: >>> >>> How big are the batch sizes? In other words, how many rows are you >>> sending per insert operation? >>> >>> Other than the above, not much else to suggest without seeing some >>> example code (on pastebin, gist or similar, ideally). >>> >>> On Mon, Aug 19, 2013 at 5:49 PM, Keith Freeman <8forty@gmail.com> wrote= : >>> >>>> I've got a 3-node cassandra cluster (16G/4-core VMs ESXi v5 on 2.5Ghz >>>> machines not shared with any other VMs). I'm inserting time-series da= ta >>>> into a single column-family using "wide rows" (timeuuids) and have a 3= -part >>>> partition key so my primary key is something like ((a, b, day), >>>> in-time-uuid), x, y, z). >>>> >>>> My java client is feeding rows (about 1k of raw data size each) in >>>> batches using multiple threads, and the fastest I can get it run relia= bly >>>> is about 2000 rows/second. Even at that speed, all 3 cassandra nodes = are >>>> very CPU bound, with loads of 6-9 each (and the client machine is hard= ly >>>> breaking a sweat). I've tried turning off compression in my table whi= ch >>>> reduced the loads slightly but not much. There are no other updates o= r >>>> reads occurring, except the datastax opscenter. >>>> >>>> I was expecting to be able to insert at least 10k rows/second with thi= s >>>> configuration, and after a lot of reading of docs, blogs, and google, = can't >>>> really figure out what's slowing my client down. When I increase the >>>> insert speed of my client beyond 2000/second, the server responses are= just >>>> too slow and the client falls behind. I had a single-node Mysql datab= ase >>>> that can handle 10k of these data rows/second, so I really feel like I= 'm >>>> missing something in Cassandra. Any ideas? >>>> >>>> >>> >>> >> >> >> -- >> >> - John >> >> >> > > --047d7b2e4d7c23b40204e4691a53 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Ugh - sorry, I knew Sylvain and=A0Micha=EBl had worked on this recently but it= is only in 2.0 - I could have sworn it got marked for=A0inclusion b= ack into 1.2 but I was wrong:

This is indeed an issue if you don't know the column count before hand= (or had a very large number of them like in your case). Again, apologies, = I would not have recommended that route if I knew it was only in 2.0.=A0

I would be willing to bet you could hit those insert nu= mbers pretty easily with thrift given the shape of your mutation.=A0
<= /div>


On Tue, = Aug 20, 2013 at 5:00 PM, Keith Freeman <8forty@gmail.com> wro= te:
=20 =20 =20
So I tried inserting prepared statements separately (no batch), and my server nodes load definitely dropped significantly.=A0 Throughput from my client improved a bit, but only a few %.=A0 I was able to *almost* get 5000 rows/sec (sort of) by also reducing the rows/insert-thread to 20-50 and eliminating all overhead from the timing, i.e. timing only the tight for loop of inserts.=A0 But that'= ;s still a lot slower than I expected.

I couldn't do batches because the driver doesn't allow prepared statements in a batch (QueryBuilder API).=A0 It appears the batch itself could possibly be a prepared statement, but since I have 40+ columns on each insert that would take some ugly code to build so I haven't tried it yet.

I'm using CL "ONE" on the inserts and RF 2 in my schema.<= div>


On 08/20/2013 08:04 AM, Nate McCall wrote:
John makes a good point re:prepared statements (I= 9;d increase batch sizes again once you did this as well - separate, incremental runs of course so you can gauge the effect of each). That should take out some of the processing overhead of statement validation in the server (some - that load spike still seems high though).=A0

I'd actually be really interested as to what your results were after doing so - i've not tried any A/B testing here for prepared statements on inserts.=A0

Given your load is on the server, i'm not sure adding more async indirection on the client would buy you too much though.=A0

Also, at what RF and consistency level are you writing?


On Tue, Aug 20, 2013 at 8:56 AM, Keith Freeman <8forty@gmail.com> wrote:
Ok, I'll try pre= pared statements.=A0=A0 But while sending my statements async might speed up my client, it wouldn't improve throughput on the cassandra nodes would it?=A0 They're running at pretty hi= gh loads and only about 10% idle, so my concern is that they can't handle the data any faster, so something's wron= g on the server side.=A0 I don't really think there's anyt= hing on the client side that matters for this problem.

Of course I know there are obvious h/w things I can do to improve server performance: SSDs, more RAM, more cores, etc.=A0 But I thought the servers I have would be able to handle more rows/sec than say Mysql, since write speed is supposed to be one of Cassandra's strengths.


On 08/19/2013 09:03 PM, John Sanda wrote:
I'd suggest using prepared stateme= nts that you initialize at application start up and switching to use Session.executeAsync coupled with Google Guava Futures API to get better throughput on the client side.


On Mon, Aug 19, 2013 at 10:14 PM, Keith Freeman <8forty@gmail.com> wrote:
Sure, I've tried different numbers for batches an= d threads, but generally I'm running 10-30 threads at a time on the client, each sending a batch of 100 insert statements in every call, using the QueryBuilder.batch() API from the latest datastax java driver, then calling the Session.execute() function (synchronous) on the Batch.

I can't post my code, but my client does this on each iteration:
-- divides up the set of inserts by the number of threads
-- stores the current time
-- tells all the threads to send their inserts
-- then when they've all returned checks th= e elapsed time

At about 2000 rows for each iteration, 20 threads with 100 inserts each finish in about 1 second.=A0 For 4000 rows, 40 threads with 100 inserts each finish in about 1.5 - 2 seconds, and as I said all 3 cassandra nodes have a heavy CPU load while the client is hardly loaded.=A0 I've tried with 10 threads and more inserts per batch, or up to 60 threads with fewer, doesn't seem to make a lot of difference.


On 08/19/2013 05:00 PM, Nate McCall wrote:
How big are the batch sizes? In other words, how many rows are you sending per insert operation?

Other than the above, not much else to suggest without seeing some example code (on pastebin, gist or similar, ideally).=A0

On Mon, Aug 19, 2013 at 5:49 PM, Keith Freeman <8forty@gmail.com> wrote:
I&#= 39;ve got a 3-node cassandra cluster (16G/4-core VMs ESXi v5 on 2.5Ghz machines not shared with any other VMs). =A0I'm inserting time-series data into a single column-family using "wide rows" (time= uuids) and have a 3-part partition key so my primary key is something like ((a, b, day), in-time-uuid), x, y, z).

My java client is feeding rows (about 1k of raw data size each) in batches using multiple threads, and the fastest I can get it run reliably is about 2000 rows/second. =A0Even at that speed, all 3 cassandra nodes are very CPU bound, with loads of 6-9 each (and the client machine is hardly breaking a sweat). =A0I've tried turning off compression in my table which reduced the loads slightly but not much. =A0There are no other updates or reads occurring, except the datastax opscenter.

I was expecting to be able to insert at least 10k rows/second with this configuration, and after a lot of reading of docs, blogs, and google, can't really figure out what's slowing my client down. =A0When I increase the insert speed of my client beyond 2000/second, the server responses are just too slow and the client falls behind. =A0I had a single-node Mysql database that can handle 10k of these data rows/second, so I really feel like I'm missin= g something in Cassandra. =A0Any ideas?






--

- John




--047d7b2e4d7c23b40204e4691a53--