Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-23862

High contention on last_value in my_timer_microseconds

    XMLWordPrintable

Details

    • Task
    • Status: Open (View Workflow)
    • Minor
    • Resolution: Unresolved
    • None
    • None
    • None

    Description

      Description:
      There are two functions: my_timer_microseconds and my_timer_milliceconds in mysys/my_rdtsc.cc. Both functions save last seen value in a last_value static variable which is shared across all running threads. This trick was implemented because of an ancient bug report about gettimeofday intermittent errors.

      After Linux kernel source investigation I found that the only way in which gettimeofday can fail with tz=NULL passed is to use an invalid pointer as the first argument but this is definitely not our case.

      Even if we assume that intermittent errors of gettimeofday are possible then this failures are handled quite inconsistently throughout the MySQL source. In some cases we run an endless loop until it succeeds, in some cases we just ignore failures, and in some cases we return "last seen" value. The latter is the most expensive method, because it involves updating a global variable.

      The price to pay is visible on modern Linux where gettimeofday with tz=NULL may never fail, below are sysbench results on X86 and AARCH64 for vanilla and patched version of my_timer_microseconds where assumed that gettimeofday is reliable:

      AARCH64:

      test threads vanilla patched diff
      :-------: --------: ------------: -----------: ------:
      OLTP_PS 64 791578.16 807313.49 1.99%
      OLTP_PS 128 986087.11 1007570.61 2.18%
      OLTP_PS 256 986725.61 1009114.64 2.27%
      OLTP_RO 64 30258.31 30336.54 0.26%
      OLTP_RO 128 34946.59 35087.35 0.40%
      OLTP_RO 256 34994.82 35150.73 0.45%
      OLTP_RW 64 20159.63 20201.69 0.21%
      OLTP_RW 128 18579.80 18681.46 0.55%
      OLTP_RW 256 19140.54 19244.04 0.54%

      X86:

      test threads vanilla patched diff
      :-------: --------: ------------: -----------: ------:
      OLTP_PS 64 551636.06 553277.90 0.30%
      OLTP_PS 128 574358.40 579725.62 0.93%
      OLTP_PS 256 559891.53 565747.08 1.05%
      OLTP_RO 64 18662.21 18783.30 0.65%
      OLTP_RO 128 18827.19 18948.55 0.64%
      OLTP_RO 256 18602.29 18741.15 0.75%
      OLTP_RW 64 9343.21 9380.53 0.40%
      OLTP_RW 128 9880.84 9927.12 0.47%
      OLTP_RW 256 9634.62 9666.60 0.33%

      The code in question is used only in Performance Schema. Even if gettimeofday() may fail, using the expensive "last seen value" method is not any different from any other ways to handle errors: it will only result in skewed statistics, which is not that important, given how unlikely this event is.

      Attachments

        Activity

          People

            Unassigned Unassigned
            georgykirichenko Georgy Kirichenko
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:

              Git Integration

                Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.