亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

NUMA架構的CPU -- 你真的用好了么?

2024-06-28 13:21:28
字體:
來源:轉載
供稿:網友
NUMA架構的CPU -- 你真的用好了么?

本文從NUMA的介紹引出常見的NUMA使用中的陷阱,繼而討論對于NUMA系統的優化方法和一些值得關注的方向。

文章歡迎轉載,但轉載時請保留本段文字,并置于文章的頂部作者:盧鈞軼(cenalulu)本文原文地址:http://cenalulu.github.io/linux/numa/

本博客已經遷移至:

http://cenalulu.github.io/

為了更好的體驗,請通過此鏈接閱讀:

http://cenalulu.github.io/linux/numa/

NUMA簡介

這部分將簡要介紹下NUMA架構的成因和具體原理,已經了解的讀者可以直接跳到第二節。

為什么要有NUMA

在NUMA架構出現前,CPU歡快的朝著頻率越來越高的方向發展。受到物理極限的挑戰,又轉為核數越來越多的方向發展。如果每個core的工作性質都是share-nothing(類似于map-reduce的node節點的作業屬性),那么也許就不會有NUMA。由于所有CPU Core都是通過共享一個北橋來讀取內存,隨著核數如何的發展,北橋在響應時間上的性能瓶頸越來越明顯。于是,聰明的硬件設計師們,先到了把內存控制器(原本北橋中讀取內存的部分)也做個拆分,平分到了每個die上。于是NUMA就出現了!

NUMA是什么

NUMA中,雖然內存直接attach在CPU上,但是由于內存被平均分配在了各個die上。只有當CPU訪問自身直接attach內存對應的物理地址時,才會有較短的響應時間(后稱Local access)。而如果需要訪問其他CPU attach的內存的數據時,就需要通過inter-connect通道訪問,響應時間就相比之前變慢了(后稱Remote Access)。所以NUMA(Non-Uniform Memory Access)就此得名。

numa

我們需要NUMA做什么

假設你是Linux教父Linus,對于NUMA架構你會做哪些優化?下面這點是顯而易見的:

既然CPU只有在Local-Access時響應時間才能有保障,那么我們就盡量把該CPU所要的數據集中在他local的內存中就OK啦~

沒錯,事實上Linux識別到NUMA架構后,默認的內存分配方案就是:優先嘗試在請求線程當前所處的CPU的Local內存上分配空間。如果local內存不足,優先淘汰local內存中無用的Page(Inactive,Unmapped)。那么,問題來了。。。


NUMA的“七宗罪”

幾乎所有的運維都會多多少少被NUMA坑害過,讓我們看看究竟有多少種在NUMA上栽的方式:

  • MySQL -- The MySQL “swap insanity” PRoblem and the effects of the NUMA architecture
  • PostgreSQL -- PostgreSQL, NUMA and zone reclaim mode on linux
  • Oracle -- Non-Uniform Memory Access (NUMA) architecture with Oracle database by examples
  • java -- Optimizing Linux Memory Management for Low-latency / High-throughput Databases

究其原因幾乎都和:“因為CPU親和策略導致的內存分配不平均”及“NUMA Zone Claim內存回收”有關,而和數據庫種類并沒有直接聯系。所以下文我們就拿MySQL為例,來看看重內存操作應用在NUMA架構下到底會出現什么問題。

MySQL在NUMA架構上會出現的問題

幾乎所有NUMA + MySQL關鍵字的搜索結果都會指向:Jeremy Cole大神的兩篇文章

  • The MySQL “swap insanity” problem and the effects of the NUMA architecture
  • A brief update on NUMA and MySQL

大神解釋的非常詳盡,有興趣的讀者可以直接看原文。博主這里做一個簡單的總結:

  • CPU規模因摩爾定律指數級發展,而總線發展緩慢,導致多核CPU通過一條總線共享內存成為瓶頸
  • 于是NUMA出現了,CPU平均劃分為若干個Chip(不多于4個),每個Chip有自己的內存控制器及內存插槽
  • CPU訪問自己Chip上所插的內存時速度快,而訪問其他CPU所關聯的內存(下文稱Remote Access)的速度相較慢三倍左右
  • 于是Linux內核默認使用CPU親和的內存分配策略,使內存頁盡可能的和調用線程處在同一個Core/Chip中
  • 由于內存頁沒有動態調整策略,使得大部分內存頁都集中在CPU 0
  • 又因為Reclaim策略優先淘汰/Swap本Chip上的內存,使得大量有用內存被換出
  • 當被換出頁被訪問時問題就以數據庫響應時間飆高甚至阻塞的形式出現了

imbalance

解決方案

Jeremy Cole大神推薦的三個方案如下,如果想詳細了解可以閱讀 原文

  • numactl --interleave=all
  • 在MySQL進程啟動前,使用sysctl -q -w vm.drop_caches=3清空文件緩存所占用的空間
  • Innodb在啟動時,就完成整個Innodb_buffer_pool_size的內存分配

這三個方案也被業界普遍認可可行,同時在 Twitter 的5.5patch 和 Percona 5.5 Improved NUMA Support 中作為功能被支持。

不過這種三合一的解決方案只是減少了NUMA內存分配不均,導致的MySQL SWAP問題出現的可能性。如果當系統上其他進程,或者MySQL本身需要大量內存時,Innodb Buffer Pool的那些Page同樣還是會被Swap到存儲上。于是又在這基礎上出現了另外幾個進階方案

  • 配置vm.zone_reclaim_mode = 0使得內存不足時去remote memory分配優先于swap out local page
  • echo -15 > /proc/<pid_of_mysqld>/oom_adj調低MySQL進程被OOM_killer強制Kill的可能
  • memlock
  • 對MySQL使用Huge Page(黑魔法,巧用了Huge Page不會被swap的特性)
重新審視問題

如果本文寫到這里就這么結束了,那和搜索引擎結果中大量的Step-by-Step科普帖沒什么差別。雖然我們用了各種參數調整減少了問題發生概率,那么真的就徹底解決了這個問題么?問題根源究竟是什么?讓我們回過頭來重新審視下這個問題:

NUMA Interleave真的好么?

為什么Interleave的策略就解決了問題?借用兩張 Carrefour性能測試 的結果圖,可以看到幾乎所有情況下Interleave模式下的程序性能都要比默認的親和模式要高,有時甚至能高達30%。究其根本原因是Linux服務器的大多數workload分布都是隨機的:即每個線程在處理各個外部請求對應的邏輯時,所需要訪問的內存是在物理上隨機分布的。而Interleave模式就恰恰是針對這種特性將內存page隨機打散到各個CPU Core上,使得每個CPU的負載和Remote Access的出現頻率都均勻分布。相較NUMA默認的內存分配模式,死板的把內存都優先分配在線程所在Core上的做法,顯然普遍適用性要強很多。perf1perf2

也就是說,像MySQL這種外部請求隨機性強,各個線程訪問內存在地址上平均分布的這種應用,Interleave的內存分配模式相較默認模式可以帶來一定程度的性能提升。此外 各種 論文 中也都通過實驗證實,真正造成程序在NUMA系統上性能瓶頸的并不是Remote Acess帶來的響應時間損耗,而是內存的不合理分布導致Remote Access將inter-connect這個小水管塞滿所造成的結果。而Interleave恰好,把這種不合理分布情況下的Remote Access請求平均分布在了各個小水管中。所以這也是Interleave效果奇佳的一個原因。

那是不是簡簡單單的配置個Interleave就已經把NUMA的特性和性能發揮到了極致呢?答案是否定的,目前Linux的內存分配機制在NUMA架構的CPU上還有一定的改進空間。例如:Dynamic Memory Loaction, Page Replication

Dynamic Memory Location我們來想一下這個情況:MySQL的線程分為兩種,用戶線程(SQL執行線程)和內部線程(內部功能,如:flush,io,master等)。對于用戶線程來說隨機性相當的強,但對于內部線程來說他們的行為以及所要訪問的內存區域其實是相對固定且可以預測的。如果能對于這把這部分內存集中到這些內存線程所在的core上的時候,就能減少大量Remote Access,潛在的提升例如Page Flush,Purge等功能的吞吐量,甚至可以提高MySQL Crash后Recovery的速度(由于recovery是單線程)。那是否能在Interleave模式下,把那些明顯應該聚集在一個CPU上的內存集中在一起呢?很可惜,Dynamic Memory Location這種技術目前只停留在理論和實驗階段。我們來看下難點:要做到按照線程的行為動態的調整page在memory的分布,就勢必需要做線程和內存的實時監控(profile)。對于Memory Access這種非常異常頻繁的底層操作來說增加profile入口的性能損耗是極大的。在 關于CPU Cache程序應該知道的那些事的評論中我也提到過,這個道理和為什么Linux沒有全局監控CPU L1/L2 Cache命中率工具的原因是一樣的。當然優化不會就此停步。上文提到的Carrefour算法和Linux社區的Auto NUMA patch都是積極的嘗試。什么時候內存profile出現硬件級別,類似于CPU中 PMU 的功能時,動態內存規劃就會展現很大的價值,甚至會作為Linux Kernel的一個內部功能來實現。到那時我們再回過頭來審視這個方案的實際價值。

Page Replication再來看一下這些情況:一些動態加載的庫,把他們放在任何一個線程所在的CPU都會導致其他CPU上線程的執行效率下降。而這些共享數據往往讀寫比非常高,如果能把這些數據的副本在每個Memory Zone內都放置一份,理論上會帶來較大的性能提升,同時也減少在inter-connect上出現的瓶頸。實時上,仍然是上文提到的Carrefour也做了這樣的嘗試。由于缺乏硬件級別(如MESI協議的硬件支持)和操作系統原生級別的支持,Page Replication在數據一致性上維護的成本顯得比他帶來的提升更多。因此這種嘗試也僅僅停留在理論階段。當然,如果能得到底層的大力支持,相信這個方案還是有極大的實際價值的。

究竟是哪里出了問題

NUMA的問題?NUMA本身沒有錯,是CPU發展的一種必然趨勢。但是NUMA的出現使得操作系統不得不關注內存訪問速度不平均的問題。

Linux Kenel內存分配策略的問題?分配策略的初衷是好的,為了內存更接近需要他的線程,但是沒有考慮到數據庫這種大規模內存使用的應用場景。同時缺乏動態調整的功能,使得這種悲劇在內存分配的那一刻就被買下了伏筆。

數據庫設計者不懂NUMA?數據庫設計者也許從一開始就不會意識到NUMA的流行,或者甚至說提供一個透明穩定的內存訪問是操作系統最基本的職責。那么在現狀改變非常困難的情況下(下文會提到為什么困難)是不是作為內存使用者有義務更好的去理解使用NUMA?

  • Percona NUMA aware Configuration
  • Numa system performance issues – more than just swapping to consider
  • MySQL Server and NUMA architectures
  • Checking /proc/pid/numa_maps can be dangerous for mysql client connections
  • on swapping and kernels
  • Optimizing Linux Memory Management for Low-latency / High-throughput Databases
  • Memory System Performance in a NUMA Multicore Multiprocessor
  • A Case for NUMA-aware Contention Management on Multicore Systems

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美成人精品| 久久久人成影片一区二区三区| 成人亚洲欧美一区二区三区| 国产精品日韩欧美大师| 国产精品pans私拍| 欧美中在线观看| 一本久久综合亚洲鲁鲁| 国产伦精品一区二区三区精品视频| 亚洲人成绝费网站色www| 欧美片一区二区三区| 国产女人18毛片水18精品| 国产精品自产拍在线观看| 正在播放欧美一区| 国产精品高精视频免费| 欧美日韩国产精品专区| 国产精品免费电影| 久久久久久国产免费| 91九色在线视频| 尤物99国产成人精品视频| 精品国偷自产在线视频99| 国产一区二区三区丝袜| 国产精品福利在线观看| 久久综合免费视频| 欧美日韩高清区| 亚洲欧美日韩一区二区三区在线| 性欧美办公室18xxxxhd| 亚洲欧洲在线视频| 日韩不卡中文字幕| 亚洲精品一区中文字幕乱码| 欧洲s码亚洲m码精品一区| 日韩欧美第一页| 激情久久av一区av二区av三区| 66m—66摸成人免费视频| 欧美在线视频网站| 欧美日韩精品在线| 欧美日韩免费观看中文| 日韩一区二区欧美| 亚洲精品xxx| 久久久久久18| 成人精品一区二区三区电影黑人| 在线观看国产精品日韩av| 91久久国产综合久久91精品网站| 国产69精品久久久| 欧美做受高潮电影o| 国产精品美女呻吟| 国产视频久久久久| 欧美精品九九久久| 欧美日韩亚洲系列| 久久国内精品一国内精品| 91亚洲永久免费精品| 91视频8mav| 亚洲aa中文字幕| 成人午夜在线影院| 97激碰免费视频| 亚洲美女av在线| 秋霞成人午夜鲁丝一区二区三区| 热re99久久精品国产66热| 国产精品视频免费在线| 久久精品91久久久久久再现| 丝袜美腿精品国产二区| 国产免费亚洲高清| 精品视频www| 国产ts一区二区| 久久国产加勒比精品无码| 国产一区二区动漫| 国产精品视频白浆免费视频| 亚洲第一男人av| 欧美视频中文在线看| 国产精品美女免费| 国产日韩欧美视频| 国产亚洲精品久久| 欧美国产亚洲精品久久久8v| 在线看欧美日韩| 久久久免费精品视频| 欧美亚洲第一页| 26uuu亚洲伊人春色| 欧美一区二区三区艳史| 97超级碰在线看视频免费在线看| 一本一本久久a久久精品牛牛影视| 日韩女在线观看| 欧美性videos高清精品| 欧洲亚洲妇女av| 亚洲欧洲日韩国产| 欧美日本国产在线| 亚洲精品国产品国语在线| 一区二区欧美日韩视频| 日韩欧美国产视频| 2018国产精品视频| 欧美日韩免费网站| 欧美一级淫片播放口| 欧美另类99xxxxx| 亚洲欧美成人网| 日韩av一区二区在线| 欧美丝袜美女中出在线| 亚洲精品狠狠操| 91视频国产高清| 欧美午夜片在线免费观看| 欧美成人在线影院| 日韩欧美成人网| 国产精品99久久久久久久久久久久| 亚洲人成电影网站| 日本在线观看天堂男亚洲| 日韩av电影在线免费播放| 精品成人69xx.xyz| 日本伊人精品一区二区三区介绍| 精品福利在线观看| 欧美日韩国产精品专区| 欧美—级a级欧美特级ar全黄| 国产精品高潮呻吟久久av黑人| 国产精品日韩久久久久| 日韩av免费网站| 久久久精品在线观看| 亚洲视频精品在线| 精品视频在线播放免| 中文字幕精品在线视频| 一区二区三区www| 欧美黄色小视频| 亚洲老头同性xxxxx| 8050国产精品久久久久久| 国产成人精品一区二区三区| 91亚洲精品久久久久久久久久久久| 亚洲精品久久久久久久久| 亚洲国产日韩欧美综合久久| 欧美日韩精品国产| 欧美中文在线观看| 久久久免费观看视频| 日韩欧美中文在线| 国产精品视频一| 久久天堂av综合合色| 色偷偷av亚洲男人的天堂| 国产精品视频久久久| 日韩视频在线免费| 久久人人爽国产| 精品夜色国产国偷在线| 国产精品久久久av| 日韩视频永久免费观看| 欧美国产视频一区二区| 久久91精品国产| 亚洲欧美综合另类中字| 亚洲欧美精品一区二区| 日韩激情片免费| 国产精品久久网| 在线观看日韩欧美| 色偷偷91综合久久噜噜| 国产精品一二三视频| 亚州欧美日韩中文视频| 久久精品国产91精品亚洲| 亚洲成av人片在线观看香蕉| 亚洲国产小视频在线观看| 亚洲国产精品成人一区二区| 日本精品性网站在线观看| 亚洲日本中文字幕免费在线不卡| 国产一区二区激情| 在线观看精品自拍私拍| 九九久久国产精品| 亚洲国产成人精品久久| 久久精视频免费在线久久完整在线看| 久久久久久久香蕉网| 久久久999国产精品| 国模私拍视频一区| 色视频www在线播放国产成人| 亚洲第一精品夜夜躁人人爽| 久久伊人91精品综合网站| 88国产精品欧美一区二区三区|