[Pacemaker] Managing big number of globally-unique clone instances

Vladislav Bogdanov bubble at hoster-ok.com
Mon Jul 21 15:07:46 CEST 2014


21.07.2014 13:37, Andrew Beekhof wrote:
> 
> On 21 Jul 2014, at 3:09 pm, Vladislav Bogdanov <bubble at hoster-ok.com> wrote:
> 
>> 21.07.2014 06:21, Andrew Beekhof wrote:
>>>
>>> On 18 Jul 2014, at 5:16 pm, Vladislav Bogdanov <bubble at hoster-ok.com> wrote:
>>>
>>>> Hi Andrew, all,
>>>>
>>>> I have a task which seems to be easily solvable with the use of
>>>> globally-unique clone: start huge number of specific virtual machines to
>>>> provide a load to a connection multiplexer.
>>>>
>>>> I decided to look how pacemaker behaves in such setup with Dummy
>>>> resource agent, and found that handling of every instance in an
>>>> "initial" transition (probe+start) slows down with increase of clone-max.
>>>
>>> "yep"
>>>
>>> for non unique clones the number of probes needed is N, where N is the number of nodes.
>>> for unique clones, we must test every instance and node combination, or N*M, where M is clone-max.
>>>
>>> And that's just the running of the probes... just figuring out which nodes need to be
>>> probed is incredibly resource intensive (run crm_simulate and it will be painfully obvious). 
>>>
>>>>
>>>> F.e. for 256 instances transition took 225 seconds, ~0.88s per instance.
>>>> After I added 768 more instances (set clone-max to 1024)
> 
> How many nodes though?

Two nodes run in VMs.

> Assuming 3, thats still only ~1s per operation (including the time taken to send the operation across the network twice and update the cib).
> 
>>>> together with
>>>> increasing batch-limit to 512, transition took almost an hour (3507
>>>> seconds), or ~4.57s per added instance. Even if I take in account that
>>>> monitoring of already started instances consumes some resources, last
>>>> number seems to be rather big,
>>
>> I believe this ^ is the main point.
>> If with N instances probe/start of _each_ instance takes X time slots,
>> then with 4*N instances probe/start of _each_ instance takes ~5*X time
>> slots. In an ideal world, I would expect it to remain constant.
> 
> Unless you have 512 cores in the cluster, increasing the batch-limit in this way is certainly not going to give you the results you're looking for.
> Firing more tasks at a machine just ends up in producing more context switches as the kernel tries to juggle the various tasks.
> 
> More context switches == more CPU wasted == more time taken overall == completely consistent with your results. 

Thanks to the oprofile, I was able to gain speedup by 8-9% with following patch:
=========
diff --git a/crmd/te_utils.c b/crmd/te_utils.c
index 2167370..c612718 100644
--- a/crmd/te_utils.c
+++ b/crmd/te_utils.c
@@ -374,8 +374,6 @@ te_graph_trigger(gpointer user_data)
         graph_rc = run_graph(transition_graph);
         transition_graph->batch_limit = limit; /* Restore the configured value */
 
-        print_graph(LOG_DEBUG_3, transition_graph);
-
         if (graph_rc == transition_active) {
             crm_trace("Transition not yet complete");
             return TRUE;
diff --git a/crmd/tengine.c b/crmd/tengine.c
index 765628c..ec0e1d4 100644
--- a/crmd/tengine.c
+++ b/crmd/tengine.c
@@ -221,7 +221,6 @@ do_te_invoke(long long action,
         }
 
         trigger_graph();
-        print_graph(LOG_DEBUG_2, transition_graph);
 
         if (graph_data != input->xml) {
             free_xml(graph_data);
=========

Results this time are measured only for clean start op, after probes are done (add
stopped clone, wait for probes to complete and then start clone).
 256(vanilla): 09:51:50 - 09:53:17 =>  1:27 =   87s => 0.33984375 s per instance
1024(vanilla): 10:17:10 - 10:34:34 => 17:24 = 1044s => 1.01953125 s per instance
1024(patched): 11:59:26 - 12:15:12 => 15:46 =  946s => 0.92382813 s per instance

So, still not perfect, but better.

Unfortunately, my binaries are build with optimization, so I'm not able to get call
graphs yet.

Also, as I run in VMs, no hardware support for oprofile is available, so results may be
inaccurate a bit.

Here is system-wide opreport's top for unpatched crmd with 1024 instances:
CPU: CPU with timer interrupt, speed 0 MHz (estimated)
Profiling through timer interrupt
samples  %        image name               app name                 symbol name
429963   41.3351  no-vmlinux               no-vmlinux               /no-vmlinux
129533   12.4528  libxml2.so.2.7.6         libxml2.so.2.7.6         /usr/lib64/libxml2.so.2.7.6
101326    9.7411  libc-2.12.so             libc-2.12.so             __strcmp_sse42
42524     4.0881  libtransitioner.so.2.0.1 libtransitioner.so.2.0.1 print_synapse
37062     3.5630  libc-2.12.so             libc-2.12.so             malloc_consolidate
23268     2.2369  libcrmcommon.so.3.2.0    libcrmcommon.so.3.2.0    find_entity
21416     2.0589  libc-2.12.so             libc-2.12.so             _int_malloc
18950     1.8218  libcrmcommon.so.3.2.0    libcrmcommon.so.3.2.0    crm_element_value
17482     1.6807  libfreebl3.so            libfreebl3.so            /lib64/libfreebl3.so
15350     1.4757  libc-2.12.so             libc-2.12.so             vfprintf
15016     1.4436  libqb.so.0.16.0          libqb.so.0.16.0          /usr/lib64/libqb.so.0.16.0
13189     1.2679  bash                     bash                     /bin/bash
11375     1.0936  libc-2.12.so             libc-2.12.so             _int_free
10762     1.0346  libtotem_pg.so.5.0.0     libtotem_pg.so.5.0.0     /usr/lib64/libtotem_pg.so.5.0.0
10345     0.9945  libc-2.12.so             libc-2.12.so             _IO_default_xsputn
...

And with patch:
CPU: CPU with timer interrupt, speed 0 MHz (estimated)
Profiling through timer interrupt
samples  %        image name               app name                 symbol name
434810   46.2143  no-vmlinux               no-vmlinux               /no-vmlinux
125397   13.3280  libxml2.so.2.7.6         libxml2.so.2.7.6         /usr/lib64/libxml2.so.2.7.6
85259     9.0619  libc-2.12.so             libc-2.12.so             __strcmp_sse42
33563     3.5673  libc-2.12.so             libc-2.12.so             malloc_consolidate
18885     2.0072  libc-2.12.so             libc-2.12.so             _int_malloc
16714     1.7765  libcrmcommon.so.3.2.0    libcrmcommon.so.3.2.0    crm_element_value
14966     1.5907  libfreebl3.so            libfreebl3.so            /lib64/libfreebl3.so
14510     1.5422  libc-2.12.so             libc-2.12.so             vfprintf
13664     1.4523  bash                     bash                     /bin/bash
13505     1.4354  libcrmcommon.so.3.2.0    libcrmcommon.so.3.2.0    find_entity
12605     1.3397  libqb.so.0.16.0          libqb.so.0.16.0          /usr/lib64/libqb.so.0.16.0
10855     1.1537  libc-2.12.so             libc-2.12.so             _int_free
9857      1.0477  libc-2.12.so             libc-2.12.so             _IO_default_xsputn
...


> 
>> Otherwise we have an issue with scalability into this direction.
>>
>>>>
>>>> Main CPU consumer on DC while transition is running is crmd, Its memory
>>>> footprint is around 85Mb, resulting CIB size together with the status
>>>> section is around 2Mb,
>>>
>>> You said CPU and then listed RAM...
>>
>> Something wrong with that? :)
>> That just three distinct facts.
> 
> I was expecting quantification of the relative CPU usage.
> I was also expecting the PE to have massive spikes whenever a new transition is calculated.
> 
>>
>>>
>>>>
>>>> Could it be possible to optimize this use-case from your opinion with
>>>> minimal efforts? Could it be optimized with just configuration? Or may
>>>> it be some trivial development task, f.e replace one GList with
>>>> GHashtable somewhere?
>>>
>>> Optimize: yes, Minimal: no
>>>
>>>>
>>>> Sure I can look deeper and get any additional information, f.e. to get
>>>> crmd profiling results if it is hard to get an answer just from the head.
>>>
>>> Perhaps start looking in clone_create_probe()
>>
>> Got it, thanks for pointer!
>>
>>>
>>>>
>>>> Best,
>>>> Vladislav
>>>>
>>>> _______________________________________________
>>>> Pacemaker mailing list: Pacemaker at oss.clusterlabs.org
>>>> http://oss.clusterlabs.org/mailman/listinfo/pacemaker
>>>>
>>>> Project Home: http://www.clusterlabs.org
>>>> Getting started: http://www.clusterlabs.org/doc/Cluster_from_Scratch.pdf
>>>> Bugs: http://bugs.clusterlabs.org
>>>
>>>
>>>
>>> _______________________________________________
>>> Pacemaker mailing list: Pacemaker at oss.clusterlabs.org
>>> http://oss.clusterlabs.org/mailman/listinfo/pacemaker
>>>
>>> Project Home: http://www.clusterlabs.org
>>> Getting started: http://www.clusterlabs.org/doc/Cluster_from_Scratch.pdf
>>> Bugs: http://bugs.clusterlabs.org
>>>
>>
>>
>> _______________________________________________
>> Pacemaker mailing list: Pacemaker at oss.clusterlabs.org
>> http://oss.clusterlabs.org/mailman/listinfo/pacemaker
>>
>> Project Home: http://www.clusterlabs.org
>> Getting started: http://www.clusterlabs.org/doc/Cluster_from_Scratch.pdf
>> Bugs: http://bugs.clusterlabs.org
> 
> 
> 
> _______________________________________________
> Pacemaker mailing list: Pacemaker at oss.clusterlabs.org
> http://oss.clusterlabs.org/mailman/listinfo/pacemaker
> 
> Project Home: http://www.clusterlabs.org
> Getting started: http://www.clusterlabs.org/doc/Cluster_from_Scratch.pdf
> Bugs: http://bugs.clusterlabs.org
> 




More information about the Pacemaker mailing list