Re: [sqlite] Sqlite occasionally becomes CPU greedy

2007-09-24 Thread Gururaja Nittur
On 9/24/07, Kees Nuyt <[EMAIL PROTECTED]> wrote:
> On Mon, 24 Sep 2007 10:35:51 -0700, you wrote:
>
> >Kees Nuyt wrote:
> >> On Mon, 24 Sep 2007 07:13:51 -0700, Gururaja Nittur wrote:
> >>
> >>
> >>> Sqlite experts,
> >>>
> >>> I am running Sqlite version 3.4.1. I ran some performance tests and
> >>> observed that sqlite sometimes consumes more CPU than normal (I am
> >>> using same dataset, all inserts and recreating new database for each
> >>> test). Tried running oprofiile and got the following result. The
> >>> function 'syncJournal' is taking around 60% of total Sqlite's CPU
> >>> usage.
> >>>
> >>> 1. Is this normal behaviour? If not, is there a known fix for this?
> >>>
> >>
> >> Do you use transactions? If not, every INSERT or UPDATE is a
> >> separate transaction, causing a lot of overhead because the
> >> journal is flushed for every transaction.
> >>
> >
> >I'm confused. With a bunch of INSERTs per transaction, the CPU usage can
> >be high. But with just one per transaction things will be I/O bound, and
> >I would expect low CPU usage.
>
> That's true. The thing is, Guru isn't worried about the total
> CPU usage, but about the relative amount of CPU time that is
> spent in synching the journal (60%), relative to the total CPU
> time in SQLite (100%).


Yes! you are right. The overall CPU is not that high. I am seeing
spikes in sqlite CPU usage and not getting consistent results. So
started profiling. It may be due to transaction size as well.

I tried to understand syncJournal code a little bit. It is pretty
evident that the following loop in pager.cc is consuming lot of CPU
cycles (it iterates upto  SQLITE_DEFAULT_CACHE_SIZE, i.e, 2000 times
per transaction).


 2716 22.6768 :for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){
   79  0.6596 :  pPg->needSync = 0;
  :}


One thing I didn't understand is, why we need to traverse through all
pages and update needSync flag. Can't we keep a list of dirty pages
and clear needSync only in those pages?

Also, what would be the effect of reducing SQLITE_DEFAULT_CACHE_SIZE
from 2000 to say 500?. My application mostly writes or updates the
database and rarely reads from it. Reducing cache pages would help me?

Thanks,
Guru


>
> >Gerry
> --
>   (  Kees Nuyt
>   )
> c[_]
>
> -
> To unsubscribe, send email to [EMAIL PROTECTED]
> -
>
>

-
To unsubscribe, send email to [EMAIL PROTECTED]
-



Re: [sqlite] Sqlite occasionally becomes CPU greedy

2007-09-24 Thread Kees Nuyt
On Mon, 24 Sep 2007 10:35:51 -0700, you wrote:

>Kees Nuyt wrote:
>> On Mon, 24 Sep 2007 07:13:51 -0700, Gururaja Nittur wrote:
>>
>>   
>>> Sqlite experts,
>>>
>>> I am running Sqlite version 3.4.1. I ran some performance tests and
>>> observed that sqlite sometimes consumes more CPU than normal (I am
>>> using same dataset, all inserts and recreating new database for each
>>> test). Tried running oprofiile and got the following result. The
>>> function 'syncJournal' is taking around 60% of total Sqlite's CPU
>>> usage.
>>>
>>> 1. Is this normal behaviour? If not, is there a known fix for this?
>>> 
>>
>> Do you use transactions? If not, every INSERT or UPDATE is a
>> separate transaction, causing a lot of overhead because the
>> journal is flushed for every transaction.
>>   
>
>I'm confused. With a bunch of INSERTs per transaction, the CPU usage can 
>be high. But with just one per transaction things will be I/O bound, and 
>I would expect low CPU usage.

That's true. The thing is, Guru isn't worried about the total
CPU usage, but about the relative amount of CPU time that is
spent in synching the journal (60%), relative to the total CPU
time in SQLite (100%).

>Gerry
-- 
  (  Kees Nuyt
  )
c[_]

-
To unsubscribe, send email to [EMAIL PROTECTED]
-



Re: [sqlite] Sqlite occasionally becomes CPU greedy

2007-09-24 Thread Gerry Snyder

Kees Nuyt wrote:

On Mon, 24 Sep 2007 07:13:51 -0700, Gururaja Nittur wrote:

  

Sqlite experts,

I am running Sqlite version 3.4.1. I ran some performance tests and
observed that sqlite sometimes consumes more CPU than normal (I am
using same dataset, all inserts and recreating new database for each
test). Tried running oprofiile and got the following result. The
function 'syncJournal' is taking around 60% of total Sqlite's CPU
usage.

1. Is this normal behaviour? If not, is there a known fix for this?



Do you use transactions? If not, every INSERT or UPDATE is a
separate transaction, causing a lot of overhead because the
journal is flushed for every transaction.
  


I'm confused. With a bunch of INSERTs per transaction, the CPU usage can 
be high. But with just one per transaction things will be I/O bound, and 
I would expect low CPU usage.


Gerry

-
To unsubscribe, send email to [EMAIL PROTECTED]
-



Re: [sqlite] Sqlite occasionally becomes CPU greedy

2007-09-24 Thread Gururaja Nittur
On 9/24/07, Kees Nuyt <[EMAIL PROTECTED]> wrote:
>
> On Mon, 24 Sep 2007 07:13:51 -0700, Gururaja Nittur wrote:
>
> >Sqlite experts,
> >
> >I am running Sqlite version 3.4.1. I ran some performance tests and
> >observed that sqlite sometimes consumes more CPU than normal (I am
> >using same dataset, all inserts and recreating new database for each
> >test). Tried running oprofiile and got the following result. The
> >function 'syncJournal' is taking around 60% of total Sqlite's CPU
> >usage.
> >
> > 1. Is this normal behaviour? If not, is there a known fix for this?
>
> Do you use transactions? If not, every INSERT or UPDATE is a
> separate transaction, causing a lot of overhead because the
> journal is flushed for every transaction.

Yes! I do use transaction. But, I am testing my application's worst
case here (Inserting one record per transaction).

>
> > 2. Are there any tunables that can be used to ease the issue?
>
> Several pragma's are available, the documentation is quite
> clear:  http://www.sqlite.org/pragma.html
>
> Also read:
> http://www.sqlite.org/cvstrac/wiki?p=PerformanceConsiderations
>
> >PS: My database is pretty small.
> >I am setting max_page_count=896 and
> >page_size = 512 (Max database size = 3.5MB).
>
> I don't understand that one.
> 512 Bytes * 896 Pages would be 458752 Bytes.
> I think you would need 7168 pages of 512 bytes to accomodate 3.5
> MByte.

Oops! my fault. You are right. I had changed the max_page_count=896 to
test with smaller database. I do see similar behavior when max size is
3.5M.

>
> Ideally, the page_size should equal the allocation unit (for
> Window: the cluster size of the formatted disk).
> Also, if your rows can be large, a too small page_size would
> cause overflow pages, and thus additional overhead.

I expect most of my rows to be less than 512 bytes and hence using
smaller page_size.

Thanks for the response. I just wanted to find out if there are any
known issues with syncJournal. I will tweak more parameters and try to
measure again.


Best regards,
Guru

>
> >Thanks in advance.
>
> I hope this helps.
> --
>   (  Kees Nuyt
>   )
> c[_]
>
> -
> To unsubscribe, send email to [EMAIL PROTECTED]
> -
>
>

-
To unsubscribe, send email to [EMAIL PROTECTED]
-



Re: [sqlite] Sqlite occasionally becomes CPU greedy

2007-09-24 Thread Kees Nuyt

On Mon, 24 Sep 2007 07:13:51 -0700, Gururaja Nittur wrote:

>Sqlite experts,
>
>I am running Sqlite version 3.4.1. I ran some performance tests and
>observed that sqlite sometimes consumes more CPU than normal (I am
>using same dataset, all inserts and recreating new database for each
>test). Tried running oprofiile and got the following result. The
>function 'syncJournal' is taking around 60% of total Sqlite's CPU
>usage.
>
> 1. Is this normal behaviour? If not, is there a known fix for this?

Do you use transactions? If not, every INSERT or UPDATE is a
separate transaction, causing a lot of overhead because the
journal is flushed for every transaction.

> 2. Are there any tunables that can be used to ease the issue?

Several pragma's are available, the documentation is quite
clear:  http://www.sqlite.org/pragma.html

Also read:
http://www.sqlite.org/cvstrac/wiki?p=PerformanceConsiderations

>PS: My database is pretty small. 
>I am setting max_page_count=896 and
>page_size = 512 (Max database size = 3.5MB).

I don't understand that one.
512 Bytes * 896 Pages would be 458752 Bytes.
I think you would need 7168 pages of 512 bytes to accomodate 3.5
MByte.

Ideally, the page_size should equal the allocation unit (for
Window: the cluster size of the formatted disk).
Also, if your rows can be large, a too small page_size would
cause overflow pages, and thus additional overhead.

>Thanks in advance.

I hope this helps.
-- 
  (  Kees Nuyt
  )
c[_]

-
To unsubscribe, send email to [EMAIL PROTECTED]
-