<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                NUMA?問題曾經一直是困擾DBA的一個大問題,早在 2010 年, 就有人給MySQL報了Bug#[57241](https://bugs.mysql.com/bug.php?id=57241 "NUMA aware mysqld_safe/mysqld"), 指出了MySQL在x86系統下存在嚴重的 “swap insanity” 問題。在NUMA架構越來越普遍的今天,這個問題越來越嚴重。 ## MySQL的?swap insanity?問題 有同學專門翻譯了Jeremy Cole關于 “swap insanity” 問題的[文章](http://sohulinux.blog.sohu.com/181968823.html "NUMA 架構中 MySQL 的 “swap insanity” 問題"),原文看[這里](http://blog.jcole.us/2010/09/28/mysql-swap-insanity-and-the-numa-architecture/ "Jeremy Cole"), 如果你沒空看的話,這里簡單描述一下,就是當你把主機大部分內存分配給InnoDB時,你會發現明明操作系統還有很多內存,但是卻有很多內存被交換到了SWAP分區。 從[這里](http://ozlabs.org/~anton/junkcode/latency2001.c)可以下載到一個測試的C代碼,如果你有NUMA架構的服務器,可以測試下不同分配方式的性能差異: ~~~ sudo -s echo 2048 > /proc/sys/vm/nr_hugepages echo 1000000000000 > /proc/sys/kernel/shmmax # Node local allocation for i in `seq 0 4 127` do ./latency2001 -a $i -c $i -l 128M done # Allocate on memory on CPU 0 for i in `seq 0 4 127` do ./latency2001 -a 0 -c $i -l 128M done ~~~ 有兩個方式可以解決這個問題: 1\. 在Linux Kernel啟動參數中加上numa=off(這樣也會影響到其他進程使用NUMA); 2\. 在mysqld_safe腳本中加上“numactl –interleave all”來啟動mysqld。 當然如果跑多實例,我也用過直接綁定mysqld進程到某個numa節點的方式,不過這要求每個實例分配的內存不超過每個NUMA節點管理的內存。腳本可以看[這里](http://www.penglixun.com/tech/database/mysql_multi_using_numactl.html "在NUMA處理器綁定多實例到固定核心")。 5年過去了,官方依然沒有解決這個Bug。但好消息是,官方終于著手解決這個問題了,Stewart Smith 同學提交的Bug#[72811](https://bugs.mysql.com/bug.php?id=72811 "Set NUMA mempolicy for optimum mysqld performance"),其Patch即將出現在MySQL 5.6.27, 5.7.9 版本之中。 ## 代碼層面解決NUMA問題 如果在代碼層面徹底解決NUMA問題,那么我們需要解決兩個問題: 1\. 全局內存應該采用interleave的分配方式分散在不同的numa node上; 2\. 線程內存應該采用local的分配方式分配在線程運行的numa node上。 Linux 提供了?`set_mempolicy()`?函數可以用來設置進程的內存分配策略,其中默認的MPOL_DEFAULT策略就是在當前運行的節點上分配內存,而MPOL_INTERLEAVE策略則是跨所有節點來分配內存。這個函數的說明可以看[這里](http://man7.org/linux/man-pages/man2/set_mempolicy.2.html "SET_MEMPOLICY")。 因此對于MySQL Server和InnoDB引擎都需要做修改: 1\. 在`mysqld_main()`入口設置?`set_mempolicy(MPOL_INTERLEAVE, NULL, 0)`?啟用全局分配方式; 2\. 在MySQL啟動完成之后設置`set_mempolicy(MPOL_DEFAULT, NULL, 0)`?啟用本地分配方式; 3\. 在InnoDB入口時設置?`set_mempolicy(MPOL_INTERLEAVE, NULL, 0)`?啟用全局分配方式; 4\. 在Buffer Pool分配完成時設置?`set_mempolicy(MPOL_DEFAULT, NULL, 0)`?啟用本地分配方式。 MySQL 5.6.27, 5.7.9 發布之后,將會增加一個?`innodb_numa_interleave`?參數來控制這個策略。`innodb_numa_interleave`?如果打開,那么將會按上面的策略來設置內存分配方式,如果關閉或者主機不支持NUMA,那么還是按原來的方式分配。 我們一起期待新版本的發布吧,媽媽再也不用擔心我的NUMA了!
                  <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>

                              哎呀哎呀视频在线观看