<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Apr 6, 2014 at 11:03 PM, Gilad Chaplik <span dir="ltr">&lt;<a href="mailto:gchaplik@redhat.com" target="_blank">gchaplik@redhat.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">----- Original Message -----<br>
&gt; From: &quot;Liran Zelkha&quot; &lt;<a href="mailto:liran.zelkha@gmail.com">liran.zelkha@gmail.com</a>&gt;<br>
&gt; To: &quot;Gilad Chaplik&quot; &lt;<a href="mailto:gchaplik@redhat.com">gchaplik@redhat.com</a>&gt;<br>
</div><div><div class="h5">&gt; Cc: &quot;Kobi Ianko&quot; &lt;<a href="mailto:kobi@redhat.com">kobi@redhat.com</a>&gt;, <a href="mailto:devel@linode01.ovirt.org">devel@linode01.ovirt.org</a>, &quot;engine-devel&quot; &lt;<a href="mailto:engine-devel@ovirt.org">engine-devel@ovirt.org</a>&gt;<br>

&gt; Sent: Sunday, April 6, 2014 8:51:02 PM<br>
&gt; Subject: Re: [Devel] [Engine-devel] vds_dynamic refactor<br>
&gt;<br>
&gt; On Sun, Apr 6, 2014 at 6:32 PM, Gilad Chaplik &lt;<a href="mailto:gchaplik@redhat.com">gchaplik@redhat.com</a>&gt; wrote:<br>
&gt;<br>
&gt; &gt; ----- Original Message -----<br>
&gt; &gt; &gt; From: &quot;Liran Zelkha&quot; &lt;<a href="mailto:liran.zelkha@gmail.com">liran.zelkha@gmail.com</a>&gt;<br>
&gt; &gt; &gt; To: &quot;Kobi Ianko&quot; &lt;<a href="mailto:kobi@redhat.com">kobi@redhat.com</a>&gt;<br>
&gt; &gt; &gt; Cc: &quot;Gilad Chaplik&quot; &lt;<a href="mailto:gchaplik@redhat.com">gchaplik@redhat.com</a>&gt;, <a href="mailto:devel@linode01.ovirt.org">devel@linode01.ovirt.org</a>,<br>
&gt; &gt; &quot;engine-devel&quot; &lt;<a href="mailto:engine-devel@ovirt.org">engine-devel@ovirt.org</a>&gt;<br>
&gt; &gt; &gt; Sent: Sunday, April 6, 2014 3:40:13 PM<br>
&gt; &gt; &gt; Subject: Re: [Devel] [Engine-devel] vds_dynamic refactor<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; On Sun, Apr 6, 2014 at 3:37 PM, Kobi Ianko &lt;<a href="mailto:kobi@redhat.com">kobi@redhat.com</a>&gt; wrote:<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; Joining in...<br>
&gt; &gt; &gt; &gt; From my point of view, in real life a user should have that many VDSs<br>
&gt; &gt; on<br>
&gt; &gt; &gt; &gt; one Engine (from a DB point of view).<br>
&gt; &gt; &gt; &gt; Modern DB system handles tables with millions of records and many<br>
&gt; &gt; &gt; &gt; relations, Do we really have a performance issue here?<br>
&gt; &gt; &gt; &gt; We could prefer a more easy to maintain implantation in this case over<br>
&gt; &gt; DB<br>
&gt; &gt; &gt; &gt; performance<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; Yes we do. We make many queries on the VDS view, which is a VERY<br>
&gt; &gt; complex<br>
&gt; &gt; &gt; view.<br>
&gt; &gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; Actually I quite agree with Kobi, what is the plan for VMs? why do we<br>
&gt; &gt; start with VDS...<br>
&gt; &gt; what is the biggest deploy do you know of?<br>
&gt; &gt;<br>
&gt; We start with VDS because in an idle system, with 200 hosts and several<br>
&gt; thousands VMs, this is what you get as the top queries against the<br>
&gt; database. Look at how many times getvds is called.<br>
&gt; [image: Inline image 1]<br>
&gt; BTW - the second query is an example of abusing the dynamic query<br>
&gt; mechanism. The 4th query (an update command) is a set of useless<br>
&gt; update_vds_dynamic commands.<br>
&gt;<br>
&gt; For reference, the explain plan of get VDS is something like this:<br>
&gt;<br>
&gt; QUERY PLAN<br>
&gt;<br>
&gt; -----------------------------------------------------------------------------------------------------------------------------------------------------------<br>
&gt;  Nested Loop  (cost=9.30..46.75 rows=6 width=9060) (actual<br>
&gt; time=0.063..0.068 rows=1 loops=1)<br>
&gt;    Join Filter: (vds_static.vds_id = vds_statistics.vds_id)<br>
&gt;    -&gt;  Seq Scan on vds_statistics  (cost=0.00..1.01 rows=1 width=109)<br>
&gt; (actual time=0.008..0.008 rows=1 loops=1)<br>
&gt;    -&gt;  Nested Loop  (cost=9.30..45.64 rows=6 width=8983) (actual<br>
&gt; time=0.048..0.052 rows=1 loops=1)<br>
&gt;          Join Filter: (vds_groups.vds_group_id = vds_static.vds_group_id)<br>
&gt;          -&gt;  Nested Loop Left Join  (cost=0.00..9.29 rows=1 width=1389)<br>
&gt; (actual time=0.013..0.013 rows=1 loops=1)<br>
&gt;                -&gt;  Seq Scan on vds_groups  (cost=0.00..1.01 rows=1<br>
&gt; width=1271) (actual time=0.003..0.003 rows=1 loops=1)<br>
&gt;                -&gt;  Index Scan using pk_storage_pool on storage_pool<br>
&gt;  (cost=0.00..8.27 rows=1 width=134) (actual time=0.008..0.008 rows=1<br>
&gt; loops=1)<br>
&gt;                      Index Cond: (vds_groups.storage_pool_id = id)<br>
&gt;          -&gt;  Hash Right Join  (cost=9.30..36.28 rows=6 width=7610) (actual<br>
&gt; time=0.033..0.037 rows=1 loops=1)<br>
&gt;                Hash Cond: (vds_spm_id_map.vds_id = vds_static.vds_id)<br>
&gt;                -&gt;  Seq Scan on vds_spm_id_map  (cost=0.00..22.30 rows=1230<br>
&gt; width=20) (actual time=0.003..0.003 rows=1 loops=1)<br>
&gt;                -&gt;  Hash  (cost=9.29..9.29 rows=1 width=7606) (actual<br>
&gt; time=0.019..0.019 rows=1 loops=1)<br>
&gt;                      Buckets: 1024  Batches: 1  Memory Usage: 2kB<br>
&gt;                      -&gt;  Nested Loop  (cost=0.00..9.29 rows=1 width=7606)<br>
&gt; (actual time=0.012..0.013 rows=1 loops=1)<br>
&gt;                            -&gt;  Seq Scan on vds_dynamic  (cost=0.00..1.01<br>
&gt; rows=1 width=1895) (actual time=0.006..0.006 rows=1 loops=1)<br>
&gt;                            -&gt;  Index Scan using pk_vds_static on vds_static<br>
&gt;  (cost=0.00..8.27 rows=1 width=5711) (actual time=0.005..0.006 rows=1<br>
&gt; loops=1)<br>
&gt;                                  Index Cond: (vds_id = vds_dynamic.vds_id)<br>
&gt;  Total runtime: 0.299 ms<br>
&gt; (19 rows)<br>
&gt;<br>
&gt; It&#39;s terrible. Adding any additional join will make this worse. Please<br>
&gt; don&#39;t add any more tables...<br>
<br>
</div></div>Thank you for the detailed explanation, my comments:<br>
<br>
* a very long time isn&#39;t an argument for not adding another table (should be neglectable);<br>
currently we have an unrelated problem, we need to solve it.<br></blockquote><div>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? </div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
* &gt; We start with VDS because in an idle system, with 200 hosts and several<br>
<div class="">&gt; thousands VMs, this is what you get as the top queries against the<br>
&gt; database.<br>
<br>
</div>so, if fetching VMs takes 10 minutes? and its get called a single time?<br></blockquote><div> Where do you see 10 minutes? If you are looking at the red bar it&#39;s the inherent time - total query time * number of queries. </div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
* you didn&#39;t reply on my of my suggestion of constructing the VDS records in the DB without using joins.<br></blockquote><div>If you mean materialized views - we don&#39;t have it in Postgres just yet... And even if we do, since we do many updates to vds_statistics and vds_dynamic - I&#39;m not sure it will have positive impact on our performance. If you mean joins in the database - everything that is based on VDS is done in the database. Part of the problem, since we can cache some information and only query the dynamic/statistics part of VDS, but that&#39;s another matter. </div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5"><br>
<br>
&gt;<br>
&gt; &gt;<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; ----- Original Message -----<br>
&gt; &gt; &gt; &gt; &gt; From: &quot;Gilad Chaplik&quot; &lt;<a href="mailto:gchaplik@redhat.com">gchaplik@redhat.com</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; To: &quot;Liran Zelkha&quot; &lt;<a href="mailto:liran.zelkha@gmail.com">liran.zelkha@gmail.com</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; Cc: <a href="mailto:devel@linode01.ovirt.org">devel@linode01.ovirt.org</a>, &quot;engine-devel&quot; &lt;<a href="mailto:engine-devel@ovirt.org">engine-devel@ovirt.org</a><br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; Sent: Sunday, April 6, 2014 3:32:26 PM<br>
&gt; &gt; &gt; &gt; &gt; Subject: Re: [Devel] [Engine-devel] vds_dynamic refactor<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; ----- Original Message -----<br>
&gt; &gt; &gt; &gt; &gt; &gt; From: &quot;Liran Zelkha&quot; &lt;<a href="mailto:liran.zelkha@gmail.com">liran.zelkha@gmail.com</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; To: &quot;Gilad Chaplik&quot; &lt;<a href="mailto:gchaplik@redhat.com">gchaplik@redhat.com</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; Cc: &quot;Itamar Heim&quot; &lt;<a href="mailto:iheim@redhat.com">iheim@redhat.com</a>&gt;, <a href="mailto:devel@linode01.ovirt.org">devel@linode01.ovirt.org</a>,<br>
&gt; &gt; &gt; &gt; &gt; &gt; &quot;engine-devel&quot; &lt;<a href="mailto:engine-devel@ovirt.org">engine-devel@ovirt.org</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; Sent: Sunday, April 6, 2014 3:26:24 PM<br>
&gt; &gt; &gt; &gt; &gt; &gt; Subject: Re: [Engine-devel] vds_dynamic refactor<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; On Sun, Apr 6, 2014 at 3:18 PM, Gilad Chaplik &lt;<a href="mailto:gchaplik@redhat.com">gchaplik@redhat.com</a><br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; wrote:<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; ----- Original Message -----<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; From: &quot;Itamar Heim&quot; &lt;<a href="mailto:iheim@redhat.com">iheim@redhat.com</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; To: &quot;Liran Zelkha&quot; &lt;<a href="mailto:liran.zelkha@gmail.com">liran.zelkha@gmail.com</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; Cc: &quot;Gilad Chaplik&quot; &lt;<a href="mailto:gchaplik@redhat.com">gchaplik@redhat.com</a>&gt;,<br>
&gt; &gt; &gt; &gt; <a href="mailto:devel@linode01.ovirt.org">devel@linode01.ovirt.org</a>,<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &quot;engine-devel&quot; &lt;<a href="mailto:engine-devel@ovirt.org">engine-devel@ovirt.org</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; Sent: Sunday, April 6, 2014 11:33:12 AM<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; Subject: Re: [Engine-devel] vds_dynamic refactor<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; On 04/06/2014 11:32 AM, Liran Zelkha wrote:<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; On Sun, Apr 6, 2014 at 11:22 AM, Itamar Heim &lt;<br>
&gt; &gt; <a href="mailto:iheim@redhat.com">iheim@redhat.com</a><br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &lt;mailto:<a href="mailto:iheim@redhat.com">iheim@redhat.com</a>&gt;&gt; wrote:<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;     On 04/03/2014 07:51 PM, Liran Zelkha wrote:<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;         The problem is with both updates and selects.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;         For selects - to get all the information for the VDS<br>
&gt; &gt; we<br>
&gt; &gt; &gt; &gt; have<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;         multiple<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;         joins. Adding another one will hurt performance even<br>
&gt; &gt; &gt; &gt; more.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;         For updates - we have vds_static thats hardly<br>
&gt; &gt; changed.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;         vds_statistics<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;         that changes all the time. vds_dynamic is not changed<br>
&gt; &gt; &gt; &gt; allot -<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; but<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;         is<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;         updated all the time because of the status. I think<br>
&gt; &gt; it&#39;s<br>
&gt; &gt; &gt; &gt; best<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; to<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;         split<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;         it to the two existing tables (BTW - relevant for VM<br>
&gt; &gt; as<br>
&gt; &gt; &gt; &gt; well)<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;     but we don&#39;t update it unless the status has changed,<br>
&gt; &gt; which<br>
&gt; &gt; &gt; &gt; is a<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;     rare occurance?<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; Actually - no. We can definitely see times we are updating<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; vds_dynamic<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; with no reason at all. I tried to create patches for that -<br>
&gt; &gt; but<br>
&gt; &gt; &gt; &gt; it<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; happens from many different places in the code.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; what would be updated vds_dyanmic for status not originating in<br>
&gt; &gt; &gt; &gt; update<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; run time info?<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; We have separate DB flows for that (updateStatus and<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; updatePartialVdsDynamicCalc and more in<br>
&gt; &gt; VdsDynamicDAODbFacadeImpl).<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; A question: do you know if we update status in updateVdsDynamic?<br>
&gt; &gt; :-)<br>
&gt; &gt; &gt; &gt; not<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; sure but I found a possible race for pending resources (cpu,<br>
&gt; &gt; mem),<br>
&gt; &gt; &gt; &gt; LOL<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; :-)<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; I think we do but not sure. Will check.<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; Of course it is, that was a rhetorical question :-) (a lot of<br>
&gt; &gt; emoticons<br>
&gt; &gt; &gt; &gt; and<br>
&gt; &gt; &gt; &gt; &gt; LOLs ;-))<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Still holds my original thought for having vds_on_boot.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; Let&#39;s talk f2f on Tuesday?<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; I&#39;d prefer to reach conclusions here, I&#39;d like everyone to be<br>
&gt; &gt; involved<br>
&gt; &gt; &gt; &gt; in a<br>
&gt; &gt; &gt; &gt; &gt; root issue like this one.<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; What is the update frequency of this field?<br>
&gt; &gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; which field?<br>
&gt; &gt; status? pending resources? on boot fields?<br>
&gt; &gt; iinm, status is updated mostly by user actions, at least in positive<br>
&gt; &gt; scenarios, and not that often.<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; _______________________________________________<br>
&gt; &gt; &gt; &gt; &gt; Devel mailing list<br>
&gt; &gt; &gt; &gt; &gt; <a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a><br>
&gt; &gt; &gt; &gt; &gt; <a href="http://lists.ovirt.org/mailman/listinfo/devel" target="_blank">http://lists.ovirt.org/mailman/listinfo/devel</a><br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt;<br>
&gt; &gt;<br>
&gt;<br>
</div></div></blockquote></div><br></div></div>