Re: [Devel] [Engine-devel] vds_dynamic refactor

2014-04-06 Thread Itamar Heim

On 04/03/2014 07:51 PM, Liran Zelkha wrote:

The problem is with both updates and selects.
For selects - to get all the information for the VDS we have multiple
joins. Adding another one will hurt performance even more.
For updates - we have vds_static thats hardly changed. vds_statistics
that changes all the time. vds_dynamic is not changed allot - but is
updated all the time because of the status. I think it's best to split
it to the two existing tables (BTW - relevant for VM as well)


but we don't update it unless the status has changed, which is a rare 
occurance?

___
Devel mailing list
Devel@ovirt.org
http://lists.ovirt.org/mailman/listinfo/devel


Re: [Devel] [Engine-devel] vds_dynamic refactor

2014-04-06 Thread Gilad Chaplik
- Original Message -
 From: Itamar Heim ih...@redhat.com
 To: Liran Zelkha liran.zel...@gmail.com
 Cc: Gilad Chaplik gchap...@redhat.com, de...@linode01.ovirt.org, 
 engine-devel engine-de...@ovirt.org
 Sent: Sunday, April 6, 2014 11:33:12 AM
 Subject: Re: [Engine-devel] vds_dynamic refactor
 
 On 04/06/2014 11:32 AM, Liran Zelkha wrote:
 
 
 
  On Sun, Apr 6, 2014 at 11:22 AM, Itamar Heim ih...@redhat.com
  mailto:ih...@redhat.com wrote:
 
  On 04/03/2014 07:51 PM, Liran Zelkha wrote:
 
  The problem is with both updates and selects.
  For selects - to get all the information for the VDS we have
  multiple
  joins. Adding another one will hurt performance even more.
  For updates - we have vds_static thats hardly changed.
  vds_statistics
  that changes all the time. vds_dynamic is not changed allot - but
  is
  updated all the time because of the status. I think it's best to
  split
  it to the two existing tables (BTW - relevant for VM as well)
 
 
  but we don't update it unless the status has changed, which is a
  rare occurance?
 
  Actually - no. We can definitely see times we are updating vds_dynamic
  with no reason at all. I tried to create patches for that - but it
  happens from many different places in the code.
 
 what would be updated vds_dyanmic for status not originating in update
 run time info?

We have separate DB flows for that (updateStatus and 
updatePartialVdsDynamicCalc and more in VdsDynamicDAODbFacadeImpl).
A question: do you know if we update status in updateVdsDynamic? :-) not sure 
but I found a possible race for pending resources (cpu, mem), LOL :-)

Still holds my original thought for having vds_on_boot.

 
___
Devel mailing list
Devel@ovirt.org
http://lists.ovirt.org/mailman/listinfo/devel


Re: [Devel] [Engine-devel] vds_dynamic refactor

2014-04-06 Thread Gilad Chaplik
- Original Message -
 From: Liran Zelkha liran.zel...@gmail.com
 To: Gilad Chaplik gchap...@redhat.com
 Cc: Itamar Heim ih...@redhat.com, de...@linode01.ovirt.org, 
 engine-devel engine-de...@ovirt.org
 Sent: Sunday, April 6, 2014 3:26:24 PM
 Subject: Re: [Engine-devel] vds_dynamic refactor
 
 On Sun, Apr 6, 2014 at 3:18 PM, Gilad Chaplik gchap...@redhat.com wrote:
 
  - Original Message -
   From: Itamar Heim ih...@redhat.com
   To: Liran Zelkha liran.zel...@gmail.com
   Cc: Gilad Chaplik gchap...@redhat.com, de...@linode01.ovirt.org,
  engine-devel engine-de...@ovirt.org
   Sent: Sunday, April 6, 2014 11:33:12 AM
   Subject: Re: [Engine-devel] vds_dynamic refactor
  
   On 04/06/2014 11:32 AM, Liran Zelkha wrote:
   
   
   
On Sun, Apr 6, 2014 at 11:22 AM, Itamar Heim ih...@redhat.com
mailto:ih...@redhat.com wrote:
   
On 04/03/2014 07:51 PM, Liran Zelkha wrote:
   
The problem is with both updates and selects.
For selects - to get all the information for the VDS we have
multiple
joins. Adding another one will hurt performance even more.
For updates - we have vds_static thats hardly changed.
vds_statistics
that changes all the time. vds_dynamic is not changed allot -
  but
is
updated all the time because of the status. I think it's best
  to
split
it to the two existing tables (BTW - relevant for VM as well)
   
   
but we don't update it unless the status has changed, which is a
rare occurance?
   
Actually - no. We can definitely see times we are updating vds_dynamic
with no reason at all. I tried to create patches for that - but it
happens from many different places in the code.
  
   what would be updated vds_dyanmic for status not originating in update
   run time info?
 
  We have separate DB flows for that (updateStatus and
  updatePartialVdsDynamicCalc and more in VdsDynamicDAODbFacadeImpl).
  A question: do you know if we update status in updateVdsDynamic? :-) not
  sure but I found a possible race for pending resources (cpu, mem), LOL :-)
 
  I think we do but not sure. Will check.

Of course it is, that was a rhetorical question :-) (a lot of emoticons and 
LOLs ;-))

 
 
  Still holds my original thought for having vds_on_boot.
 
 
 
 Let's talk f2f on Tuesday?

I'd prefer to reach conclusions here, I'd like everyone to be involved in a 
root issue like this one.

 
___
Devel mailing list
Devel@ovirt.org
http://lists.ovirt.org/mailman/listinfo/devel


Re: [Devel] [Engine-devel] vds_dynamic refactor

2014-04-06 Thread Kobi Ianko
Joining in...
From my point of view, in real life a user should have that many VDSs on one 
Engine (from a DB point of view).
Modern DB system handles tables with millions of records and many relations, Do 
we really have a performance issue here?
We could prefer a more easy to maintain implantation in this case over DB 
performance


- Original Message -
 From: Gilad Chaplik gchap...@redhat.com
 To: Liran Zelkha liran.zel...@gmail.com
 Cc: de...@linode01.ovirt.org, engine-devel engine-de...@ovirt.org
 Sent: Sunday, April 6, 2014 3:32:26 PM
 Subject: Re: [Devel] [Engine-devel] vds_dynamic refactor
 
 - Original Message -
  From: Liran Zelkha liran.zel...@gmail.com
  To: Gilad Chaplik gchap...@redhat.com
  Cc: Itamar Heim ih...@redhat.com, de...@linode01.ovirt.org,
  engine-devel engine-de...@ovirt.org
  Sent: Sunday, April 6, 2014 3:26:24 PM
  Subject: Re: [Engine-devel] vds_dynamic refactor
  
  On Sun, Apr 6, 2014 at 3:18 PM, Gilad Chaplik gchap...@redhat.com wrote:
  
   - Original Message -
From: Itamar Heim ih...@redhat.com
To: Liran Zelkha liran.zel...@gmail.com
Cc: Gilad Chaplik gchap...@redhat.com, de...@linode01.ovirt.org,
   engine-devel engine-de...@ovirt.org
Sent: Sunday, April 6, 2014 11:33:12 AM
Subject: Re: [Engine-devel] vds_dynamic refactor
   
On 04/06/2014 11:32 AM, Liran Zelkha wrote:



 On Sun, Apr 6, 2014 at 11:22 AM, Itamar Heim ih...@redhat.com
 mailto:ih...@redhat.com wrote:

 On 04/03/2014 07:51 PM, Liran Zelkha wrote:

 The problem is with both updates and selects.
 For selects - to get all the information for the VDS we have
 multiple
 joins. Adding another one will hurt performance even more.
 For updates - we have vds_static thats hardly changed.
 vds_statistics
 that changes all the time. vds_dynamic is not changed allot -
   but
 is
 updated all the time because of the status. I think it's best
   to
 split
 it to the two existing tables (BTW - relevant for VM as well)


 but we don't update it unless the status has changed, which is a
 rare occurance?

 Actually - no. We can definitely see times we are updating
 vds_dynamic
 with no reason at all. I tried to create patches for that - but it
 happens from many different places in the code.
   
what would be updated vds_dyanmic for status not originating in update
run time info?
  
   We have separate DB flows for that (updateStatus and
   updatePartialVdsDynamicCalc and more in VdsDynamicDAODbFacadeImpl).
   A question: do you know if we update status in updateVdsDynamic? :-) not
   sure but I found a possible race for pending resources (cpu, mem), LOL
   :-)
  
   I think we do but not sure. Will check.
 
 Of course it is, that was a rhetorical question :-) (a lot of emoticons and
 LOLs ;-))
 
  
  
   Still holds my original thought for having vds_on_boot.
  
  
  
  Let's talk f2f on Tuesday?
 
 I'd prefer to reach conclusions here, I'd like everyone to be involved in a
 root issue like this one.
 
  
 ___
 Devel mailing list
 Devel@ovirt.org
 http://lists.ovirt.org/mailman/listinfo/devel
 
___
Devel mailing list
Devel@ovirt.org
http://lists.ovirt.org/mailman/listinfo/devel


Re: [Devel] [Engine-devel] vds_dynamic refactor

2014-04-06 Thread Gilad Chaplik
- Original Message -
 From: Liran Zelkha liran.zel...@gmail.com
 To: Gilad Chaplik gchap...@redhat.com
 Cc: Kobi Ianko k...@redhat.com, de...@linode01.ovirt.org, engine-devel 
 engine-de...@ovirt.org
 Sent: Sunday, April 6, 2014 8:51:02 PM
 Subject: Re: [Devel] [Engine-devel] vds_dynamic refactor
 
 On Sun, Apr 6, 2014 at 6:32 PM, Gilad Chaplik gchap...@redhat.com wrote:
 
  - Original Message -
   From: Liran Zelkha liran.zel...@gmail.com
   To: Kobi Ianko k...@redhat.com
   Cc: Gilad Chaplik gchap...@redhat.com, de...@linode01.ovirt.org,
  engine-devel engine-de...@ovirt.org
   Sent: Sunday, April 6, 2014 3:40:13 PM
   Subject: Re: [Devel] [Engine-devel] vds_dynamic refactor
  
   On Sun, Apr 6, 2014 at 3:37 PM, Kobi Ianko k...@redhat.com wrote:
  
Joining in...
From my point of view, in real life a user should have that many VDSs
  on
one Engine (from a DB point of view).
Modern DB system handles tables with millions of records and many
relations, Do we really have a performance issue here?
We could prefer a more easy to maintain implantation in this case over
  DB
performance
   
Yes we do. We make many queries on the VDS view, which is a VERY
  complex
   view.
  
 
  Actually I quite agree with Kobi, what is the plan for VMs? why do we
  start with VDS...
  what is the biggest deploy do you know of?
 
 We start with VDS because in an idle system, with 200 hosts and several
 thousands VMs, this is what you get as the top queries against the
 database. Look at how many times getvds is called.
 [image: Inline image 1]
 BTW - the second query is an example of abusing the dynamic query
 mechanism. The 4th query (an update command) is a set of useless
 update_vds_dynamic commands.
 
 For reference, the explain plan of get VDS is something like this:
 
 QUERY PLAN
 
 ---
  Nested Loop  (cost=9.30..46.75 rows=6 width=9060) (actual
 time=0.063..0.068 rows=1 loops=1)
Join Filter: (vds_static.vds_id = vds_statistics.vds_id)
-  Seq Scan on vds_statistics  (cost=0.00..1.01 rows=1 width=109)
 (actual time=0.008..0.008 rows=1 loops=1)
-  Nested Loop  (cost=9.30..45.64 rows=6 width=8983) (actual
 time=0.048..0.052 rows=1 loops=1)
  Join Filter: (vds_groups.vds_group_id = vds_static.vds_group_id)
  -  Nested Loop Left Join  (cost=0.00..9.29 rows=1 width=1389)
 (actual time=0.013..0.013 rows=1 loops=1)
-  Seq Scan on vds_groups  (cost=0.00..1.01 rows=1
 width=1271) (actual time=0.003..0.003 rows=1 loops=1)
-  Index Scan using pk_storage_pool on storage_pool
  (cost=0.00..8.27 rows=1 width=134) (actual time=0.008..0.008 rows=1
 loops=1)
  Index Cond: (vds_groups.storage_pool_id = id)
  -  Hash Right Join  (cost=9.30..36.28 rows=6 width=7610) (actual
 time=0.033..0.037 rows=1 loops=1)
Hash Cond: (vds_spm_id_map.vds_id = vds_static.vds_id)
-  Seq Scan on vds_spm_id_map  (cost=0.00..22.30 rows=1230
 width=20) (actual time=0.003..0.003 rows=1 loops=1)
-  Hash  (cost=9.29..9.29 rows=1 width=7606) (actual
 time=0.019..0.019 rows=1 loops=1)
  Buckets: 1024  Batches: 1  Memory Usage: 2kB
  -  Nested Loop  (cost=0.00..9.29 rows=1 width=7606)
 (actual time=0.012..0.013 rows=1 loops=1)
-  Seq Scan on vds_dynamic  (cost=0.00..1.01
 rows=1 width=1895) (actual time=0.006..0.006 rows=1 loops=1)
-  Index Scan using pk_vds_static on vds_static
  (cost=0.00..8.27 rows=1 width=5711) (actual time=0.005..0.006 rows=1
 loops=1)
  Index Cond: (vds_id = vds_dynamic.vds_id)
  Total runtime: 0.299 ms
 (19 rows)
 
 It's terrible. Adding any additional join will make this worse. Please
 don't add any more tables...

Thank you for the detailed explanation, my comments:

* a very long time isn't an argument for not adding another table (should be 
neglectable);
currently we have an unrelated problem, we need to solve it.

*  We start with VDS because in an idle system, with 200 hosts and several
 thousands VMs, this is what you get as the top queries against the
 database.

so, if fetching VMs takes 10 minutes? and its get called a single time?

* you didn't reply on my of my suggestion of constructing the VDS records in 
the DB without using joins.


 
 
   
- Original Message -
 From: Gilad Chaplik gchap...@redhat.com
 To: Liran Zelkha liran.zel...@gmail.com
 Cc: de...@linode01.ovirt.org, engine-devel engine-de...@ovirt.org
  
 Sent: Sunday, April 6, 2014 3:32:26 PM
 Subject: Re: [Devel] [Engine-devel] vds_dynamic refactor

 - Original Message -
  From: Liran Zelkha liran.zel...@gmail.com
  To: Gilad Chaplik gchap...@redhat.com

Re: [Devel] [Engine-devel] vds_dynamic refactor

2014-04-06 Thread Liran Zelkha
On Sun, Apr 6, 2014 at 11:03 PM, Gilad Chaplik gchap...@redhat.com wrote:

 - Original Message -
  From: Liran Zelkha liran.zel...@gmail.com
  To: Gilad Chaplik gchap...@redhat.com
  Cc: Kobi Ianko k...@redhat.com, de...@linode01.ovirt.org,
 engine-devel engine-de...@ovirt.org
  Sent: Sunday, April 6, 2014 8:51:02 PM
  Subject: Re: [Devel] [Engine-devel] vds_dynamic refactor
 
  On Sun, Apr 6, 2014 at 6:32 PM, Gilad Chaplik gchap...@redhat.com
 wrote:
 
   - Original Message -
From: Liran Zelkha liran.zel...@gmail.com
To: Kobi Ianko k...@redhat.com
Cc: Gilad Chaplik gchap...@redhat.com, de...@linode01.ovirt.org,
   engine-devel engine-de...@ovirt.org
Sent: Sunday, April 6, 2014 3:40:13 PM
Subject: Re: [Devel] [Engine-devel] vds_dynamic refactor
   
On Sun, Apr 6, 2014 at 3:37 PM, Kobi Ianko k...@redhat.com wrote:
   
 Joining in...
 From my point of view, in real life a user should have that many
 VDSs
   on
 one Engine (from a DB point of view).
 Modern DB system handles tables with millions of records and many
 relations, Do we really have a performance issue here?
 We could prefer a more easy to maintain implantation in this case
 over
   DB
 performance

 Yes we do. We make many queries on the VDS view, which is a VERY
   complex
view.
   
  
   Actually I quite agree with Kobi, what is the plan for VMs? why do we
   start with VDS...
   what is the biggest deploy do you know of?
  
  We start with VDS because in an idle system, with 200 hosts and several
  thousands VMs, this is what you get as the top queries against the
  database. Look at how many times getvds is called.
  [image: Inline image 1]
  BTW - the second query is an example of abusing the dynamic query
  mechanism. The 4th query (an update command) is a set of useless
  update_vds_dynamic commands.
 
  For reference, the explain plan of get VDS is something like this:
 
  QUERY PLAN
 
 
 ---
   Nested Loop  (cost=9.30..46.75 rows=6 width=9060) (actual
  time=0.063..0.068 rows=1 loops=1)
 Join Filter: (vds_static.vds_id = vds_statistics.vds_id)
 -  Seq Scan on vds_statistics  (cost=0.00..1.01 rows=1 width=109)
  (actual time=0.008..0.008 rows=1 loops=1)
 -  Nested Loop  (cost=9.30..45.64 rows=6 width=8983) (actual
  time=0.048..0.052 rows=1 loops=1)
   Join Filter: (vds_groups.vds_group_id = vds_static.vds_group_id)
   -  Nested Loop Left Join  (cost=0.00..9.29 rows=1 width=1389)
  (actual time=0.013..0.013 rows=1 loops=1)
 -  Seq Scan on vds_groups  (cost=0.00..1.01 rows=1
  width=1271) (actual time=0.003..0.003 rows=1 loops=1)
 -  Index Scan using pk_storage_pool on storage_pool
   (cost=0.00..8.27 rows=1 width=134) (actual time=0.008..0.008 rows=1
  loops=1)
   Index Cond: (vds_groups.storage_pool_id = id)
   -  Hash Right Join  (cost=9.30..36.28 rows=6 width=7610)
 (actual
  time=0.033..0.037 rows=1 loops=1)
 Hash Cond: (vds_spm_id_map.vds_id = vds_static.vds_id)
 -  Seq Scan on vds_spm_id_map  (cost=0.00..22.30
 rows=1230
  width=20) (actual time=0.003..0.003 rows=1 loops=1)
 -  Hash  (cost=9.29..9.29 rows=1 width=7606) (actual
  time=0.019..0.019 rows=1 loops=1)
   Buckets: 1024  Batches: 1  Memory Usage: 2kB
   -  Nested Loop  (cost=0.00..9.29 rows=1 width=7606)
  (actual time=0.012..0.013 rows=1 loops=1)
 -  Seq Scan on vds_dynamic  (cost=0.00..1.01
  rows=1 width=1895) (actual time=0.006..0.006 rows=1 loops=1)
 -  Index Scan using pk_vds_static on
 vds_static
   (cost=0.00..8.27 rows=1 width=5711) (actual time=0.005..0.006 rows=1
  loops=1)
   Index Cond: (vds_id =
 vds_dynamic.vds_id)
   Total runtime: 0.299 ms
  (19 rows)
 
  It's terrible. Adding any additional join will make this worse. Please
  don't add any more tables...

 Thank you for the detailed explanation, my comments:

 * a very long time isn't an argument for not adding another table (should
 be neglectable);
 currently we have an unrelated problem, we need to solve it.

Of course it is. A very long time for a query that you execute many times
is THE factor. Who said the join has no performance effect? Have you tested
it? Under load?  Under many writes/updates?


 *  We start with VDS because in an idle system, with 200 hosts and several
  thousands VMs, this is what you get as the top queries against the
  database.

 so, if fetching VMs takes 10 minutes? and its get called a single time?

 Where do you see 10 minutes? If you are looking at the red bar it's the
inherent time - total query time * number of queries.


 * you didn't reply on my of my suggestion of constructing