<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 前言 Power平臺作為IBM的企業級平臺,其穩定性和高效能在業界尤其是大型金融企業有著良好的口碑,MariaDB作為MySQL的重要開源分支,也對IBM Power8平臺進行了適配。 很幸運我拿到了一臺Power8的機器,在Linux on Power上成功編譯了MariaDB 10.1版本,不過還沒有拿到同規格的PC服務器用于對比,所以本期我先介紹一下MariaDB on Power的一些信息,下期月報我會拿出實測對比數據,并且分析一下MariaDB在Power平臺和x86平臺上關鍵路徑的效率。 ## 關于Power平臺 與我們常見的x86平臺不同,Power平臺是RISC架構,而Intel的x86是CISC架構,早期的Mac也是采用PowerPC。 RISC相對于CISC,把主要的設計放在最常用的指令上,盡量使這些執行執行更加簡單高效,對于不常用的指令,通過組合指令來完成。所以在實現特殊任務時,RISC會比CISC更復雜,但是因為RISC指令簡單,可以更輕松的實現更多核數更多流水線來彌補。而且RISC單元電路少,功耗低,整體能耗水平會比CISC好很多。 數據庫業務屬于簡單業務,如果一臺主機只運行數據庫,那么在x86下其實有很多指令集是完全用不上的,所以理論上單位面積更低功耗,更多流水線,更高頻率的Power平臺運行數據庫會更加高效。 同時IBM也提供了Linux on Power,并且同時提供了大端、小端兩種模式,而不再要求必須是AIX,畢竟Linux大部分人會更熟悉。 ## MariaDB對Power的適配 MariaDB遷移到Power8平臺不僅僅是簡單的修改代碼讓編譯可以通過,當然這也是很重要的。 從 git log 中可以看到,官方針對Power和Intel平臺的不同,例如`CACHE_LINE_SIZE`的差異,Intel平臺是64,Power平臺是128。還有`MEMORY_BARRIER`上的差異,也會導致在鎖操作和部分IO操作上兩個平臺會有差異,MariaDB在這部分也做了修改。 另外為了能使用IBM Advance Toolchain工具集編譯 MariaDB 提升效率,也對代碼上做了不少改動以便IBM Advance Toolchain能使用。 總之看起來一切都很好,針對很多細節都做了針對性修改。 ## 編譯中的問題 既然廣告看起來這么好,那么就親自動手試一下。 在Power on Linux上我下載了MariaDB 10.1.9的源碼用GCC編譯然而報錯了: ~~~ [ 52%] Building CXX object storage/innobase/CMakeFiles/innobase.dir/api/api0api.cc.o In file included from /root/mariadb-10.1.9/storage/innobase/include/ut0ut.h:36, from /root/mariadb-10.1.9/storage/innobase/include/univ.i:636, from /root/mariadb-10.1.9/storage/innobase/api/api0api.cc:27: /root/mariadb-10.1.9/storage/innobase/include/os0sync.h:521:4: error: #error "Unsupported platform" [ 52%] Building CXX object storage/archive/CMakeFiles/archive.dir/ha_archive.cc.o In file included from /root/mariadb-10.1.9/storage/innobase/include/ sync0sync.h:837, from /root/mariadb-10.1.9/storage/innobase/include/mem0mem.h:34, from /root/mariadb-10.1.9/storage/innobase/include/data0data.h:33, from /root/mariadb-10.1.9/storage/innobase/include/que0que.h:30, from /root/mariadb-10.1.9/storage/innobase/include/api0misc.h:32, from /root/mariadb-10.1.9/storage/innobase/api/api0api.cc:38: /root/mariadb-10.1.9/storage/innobase/include/sync0sync.ic: In function ‘lock_word_t ib_mutex_test_and_set(ib_mutex_t*)’: /root/mariadb-10.1.9/storage/innobase/include/sync0sync.ic:85: error: ‘os_atomic_test_and_set’ was not declared in this scope /root/mariadb-10.1.9/storage/innobase/include/sync0sync.ic: In function ‘void mutex_reset_lock_word(ib_mutex_t*)’: /root/mariadb-10.1.9/storage/innobase/include/sync0sync.ic:113: error: ‘os_atomic_clear’ was not declared in this scope make[2]: *** [storage/innobase/CMakeFiles/innobase.dir/api/api0api.cc.o] Error 1 make[1]: *** [storage/innobase/CMakeFiles/innobase.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs.... ~~~ 查看了下報錯的代碼行: storage/innobase/include/sync0sync.ic ~~~ ib_mutex_test_and_set( /*==================*/ ib_mutex_t* mutex) /*!< in: mutex */ { #if defined(HAVE_ATOMIC_BUILTINS) return(os_atomic_test_and_set(&mutex->lock_word)); #else ~~~ storage/innobase/include/os0sync.h ~~~ 469 # if defined(HAVE_IB_GCC_ATOMIC_TEST_AND_SET) 470 471 /** Do an atomic test-and-set. 472 @param[in,out] ptr Memory location to set to non-zero 473 @return the previous value */ 474 inline 475 lock_word_t 476 os_atomic_test_and_set(volatile lock_word_t* ptr) 477 { 478 return(__atomic_test_and_set(ptr, __ATOMIC_ACQUIRE)); 479 } 480 481 /** Do an atomic clear. 482 @param[in,out] ptr Memory location to set to zero */ 483 inline 484 void 485 os_atomic_clear(volatile lock_word_t* ptr) 486 { 487 __atomic_clear(ptr, __ATOMIC_RELEASE); 488 } 489 490 # elif defined(IB_STRONG_MEMORY_MODEL) 491 492 /** Do an atomic test and set. 493 @param[in,out] ptr Memory location to set to non-zero 494 @return the previous value */ 495 inline 496 lock_word_t 497 os_atomic_test_and_set(volatile lock_word_t* ptr) 498 { 499 return(__sync_lock_test_and_set(ptr, 1)); ~~~ 可以看到,只有在`HAVE_IB_GCC_ATOMIC_TEST_AND_SET`或`IB_STRONG_MEMORY_MODEL`至少有一個標簽打開的情況,`ib_mutex_test_and_set()`中調用的`os_atomic_test_and_set()`函數才會被開啟。 然而因為RHEL6的原因,在Power8平臺上GCC只有`HAVE_ATOMIC_BUILTINS`和`__powerpc__`兩個宏(升級到RHEL7可以解決)。因此就出現了這一幕,`ib_mutex_test_and_set`中調用了`os_atomic_test_and_set()`而`os_atomic_test_and_set()`在頭文件中沒有被定義。修改很簡單啦,改成用同一個宏判斷就行了。 跟官方開發者溝通后這個fix可以解決這個問題 ~~~ diff --git a/storage/innobase/include/os0sync.h b/storage/innobase/include/os0sync.h index 8e4b4f4..e192a3a 100644 --- a/storage/innobase/include/os0sync.h +++ b/storage/innobase/include/os0sync.h @@ -487,7 +487,7 @@ os_atomic_clear(volatile lock_word_t* ptr) __atomic_clear(ptr, __ATOMIC_RELEASE); } -# elif defined(IB_STRONG_MEMORY_MODEL) +# elif defined(HAVE_ATOMIC_BUILTINS) /** Do an atomic test and set. @param[in,out] ptr Memory location to set to non-zero ~~~ ## 最后說兩句 雖然官方也是有性能測試結果的,然而顯然我們是不能相信官方測試的。因此我還會構造場景針對CPU本身的效能進行測試,下一期大家期待測試結果吧。 最后放兩張官方的測試結果,看起來還是很牛X的! ![](https://box.kancloud.cn/2015-12-18_5673f42040d3c.jpg) ![](https://box.kancloud.cn/2015-12-18_5673f4206207f.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看