public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: liqingqing <liqingqing3@huawei.com>
To: "libc-alpha@sourceware.org" <libc-alpha@sourceware.org>,
	<triegel@redhat.com>
Cc: Hushiyuan <hushiyuan@huawei.com>, Liusirui <liusirui@huawei.com>,
	<wangshuo47@huawei.com>
Subject: pthread_cond performence Discussion
Date: Mon, 16 Mar 2020 15:30:27 +0800	[thread overview]
Message-ID: <dd8a9fb4-0bf9-2f42-09ef-ba0761ffe7b5@huawei.com> (raw)

The new condvar implementation that provides stronger ordering guarantees.
For the waiters's ordering without expand the size of the struct of pthread_cond_t, It uses a little bits to maintain the state machine which has two different start group G1 and G2.
This algorithm is very cleverly.
But when I test MySQL performance and found that this new condvar implementation will affect the performance when there are many cores in one machine.
the scenario is that in my arm server, test 200 terminals to read and write the database in 4P processor environment(totally 256 cores),
and I found that It can get better performance when I use the old algorithm. here is the performace I tested:

old algorithm   new algorithm
755449.3        668712.05


I think maybe there has too many cache false sharing when in my environment. Does anyone has the same problem? And is there room for optimization about the new algorithm?


the test step is:
[root@client]# ./runBenchmark.sh props.mysql_4p_arm
[root@client]# cat props.mysql_4p_arm
db=mysql
driver=com.mysql.cj.jdbc.Driver
#conn=jdbc:mysql://222.222.222.11:3306/tpccpart
#conn=jdbc:mysql://222.222.222.132:3306/tpcc1000
#conn=jdbc:mysql://222.222.222.145:3306/tpcc
conn=jdbc:mysql://222.222.222.212:3306/tpcc
user=root
password=123456

warehouses=1000
loadWorkers=30

terminals=200
//To run specified transactions per terminal- runMins must equal zero
runTxnsPerTerminal=0
//To run for specified minutes- runTxnsPerTerminal must equal zero
runMins=5
//Number of total transactions per minute
limitTxnsPerMin=1000000000

//Set to true to run in 4.x compatible mode. Set to false to use the
//entire configured database evenly.
terminalWarehouseFixed=true

//The following five values must add up to 100
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4

// Directory name to create for collecting detailed result data.
// Comment this out to suppress.
//resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
//osCollectorScript=./misc/os_collector_linux.py
//osCollectorInterval=1
//osCollectorSSHAddr=user@dbhost
//osCollectorDevices=net_eth0 blk_sda



below is the struct of pthread_cond_t:

/* Common definition of pthread_cond_t. */       // consumer and producer maybe in the same cache_line.
struct __pthread_cond_s
{
  __extension__ union
  {
    __extension__ unsigned long long int __wseq;  //LSB is index of current G2.
    struct
    {
      unsigned int __low; //等待着的序列号,G2
      unsigned int __high; //等待着的序列号 G1
    } __wseq32;
  };
  __extension__ union
  {
    __extension__ unsigned long long int __g1_start;  // LSB is index of current G2.
    struct
    {
      unsigned int __low;
      unsigned int __high;
    } __g1_start32;
  };
  unsigned int __g_refs[2] __LOCK_ALIGNMENT;  // LSB is true if waiters should run futex_wake when they remove the last reference.
  unsigned int __g_size[2];
  unsigned int __g1_orig_size; // Initial size of G1
  unsigned int __wrefs; // Bit 2 is true if waiters should run futex_wake when they remove the
       			   last reference.  pthread_cond_destroy uses this as futex word.
			// Bit 1 is the clock ID (0 == CLOCK_REALTIME, 1 == CLOCK_MONOTONIC).
			// Bit 0 is true iff this is a process-shared condvar.
  unsigned int __g_signals[2];  // LSB is true iff this group has been completely signaled (i.e., it is closed).
};


             reply	other threads:[~2020-03-16  7:30 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-16  7:30 liqingqing [this message]
2020-03-18 12:12 ` Carlos O'Donell
2020-03-18 12:53   ` Torvald Riegel
2020-03-18 14:42     ` Carlos O'Donell
2020-05-23  4:04 ` liqingqing
2020-05-23  4:10   ` [PATCH]x86: update REP_STOSB_THRESHOLD's default value from 2k to 1M liqingqing
2020-05-23  4:37     ` [PATCH] x86: Add thresholds for "rep movsb/stosb" to tunables H.J. Lu
2020-05-28 11:56       ` H.J. Lu
2020-05-28 13:47         ` liqingqing
2020-05-29 13:13       ` Carlos O'Donell
2020-05-29 13:21         ` H.J. Lu
2020-05-29 16:18           ` Carlos O'Donell
2020-06-01 19:32             ` H.J. Lu
2020-06-01 19:38               ` Carlos O'Donell
2020-06-01 20:15                 ` H.J. Lu
2020-06-01 20:19                   ` H.J. Lu
2020-06-01 20:48                     ` Florian Weimer
2020-06-01 20:56                       ` Carlos O'Donell
2020-06-01 21:13                         ` H.J. Lu
2020-06-01 22:43                           ` H.J. Lu
2020-06-02  2:08                             ` Carlos O'Donell
2020-06-04 21:00                               ` [PATCH] libc.so: Add --list-tunables H.J. Lu
2020-06-05 22:45                                 ` V2 " H.J. Lu
2020-06-06 21:51                                   ` V3 [PATCH] libc.so: Add --list-tunables support to __libc_main H.J. Lu
2020-07-02 18:00                                     ` Carlos O'Donell
2020-07-02 19:08                                       ` [PATCH] Update tunable min/max values H.J. Lu
2020-07-03 16:14                                         ` Carlos O'Donell
2020-07-03 16:54                                           ` [PATCH] x86: Add thresholds for "rep movsb/stosb" to tunables H.J. Lu
2020-07-03 17:43                                             ` Carlos O'Donell
2020-07-03 17:53                                               ` H.J. Lu
2020-12-21  4:38     ` [PATCH]x86: update REP_STOSB_THRESHOLD's default value from 2k to 1M Siddhesh Poyarekar
2020-12-22  1:02       ` Qingqing Li

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=dd8a9fb4-0bf9-2f42-09ef-ba0761ffe7b5@huawei.com \
    --to=liqingqing3@huawei.com \
    --cc=hushiyuan@huawei.com \
    --cc=libc-alpha@sourceware.org \
    --cc=liusirui@huawei.com \
    --cc=triegel@redhat.com \
    --cc=wangshuo47@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).