當前位置:吉日网官网 - 傳統美德 - 為什麽Redis要關閉THP?

為什麽Redis要關閉THP?

在Linux下Redis啟動時可能會看到如下警告日誌:

WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

從提示看Redis建議關閉Transparent Huge Pages(THP)。

那麽什麽是Transparent Huge Pages(THP)(透明大頁)呢?

在說THP之前先說壹下Hugepages(註意:大頁(Huge Pages和透明大頁(Transparent Huge Pages)有區別)

內存是由塊管理,即眾所周知的頁面。在Linux 64位系統裏面,默認內存是以4K的頁面(Page)來管理的。也就是說壹個頁面有 4096 字節。1MB 內存等於 256 個頁面。2MB內存等於512個頁面。如果是壹個比較大的服務器內存,那麽管理大內存管理需要形成的頁面列表(相當於索引表)就很大,CPU 有內嵌的內存管理單元TLB,這些單元中包含這些頁面列表,每個頁面都使用頁表條目。頁表(Page Table)用來存放虛擬內存和物理內存頁對應關系的內存結構。如果page size較小,那麽相應的頁表內存結構就會比較大。而Hugepages的默認值page size為2M,是4KB的500倍,所以可以大大減小Page Table的大小。通過啟用 HugePages使用大頁面,可以用壹個頁表條目代表壹個大頁面,而不是使用許多條目代表較小的頁面,從而可以管理更多內存,減少操作系統對頁面狀態的維護並提高 TLB 緩存命中率。註意,Hugepagesize的大小默認為2M,這個也是可以調整的。區間範圍為2MB to 256MB。

標準大頁管理是預分配的方式,而透明大頁管理則是動態分配的方式。相信有不少人將Huge Page和Transparent Huge Pages混為壹談。目前透明大頁與傳統HugePages聯用會出現壹些問題,導致性能問題和系統重啟。Oracle 建議禁用透明大頁(Transparent Huge Pages)。在 Oracle Linux 6.5 版中,已刪除透明 HugePages。

透明大頁除了機制問題以外,在增大頁面大小縮小頁面索引列表這點上是壹樣的原理。

為什麽Redsi使用透明大頁會存在問題?

這裏就涉及到Redis在持久化AOF過程中都存在創建子進程的情況。

Redis 在AOF持久化過程中會fork壹個子進程進行AOF操作。這塊又涉及到壹個fork過程的CopyOnWrite機制。

copy-on-write技術,在fork出子進程後,與父進程***享內存空間,兩者只是虛擬空間不同,但是其對應的物理空間是同壹個;

這裏有兩個關鍵地方:

? ①fork子進程會拷貝父進程的頁面索引列表,如果索引列表小,那麽fork拷貝的內存就會小,那麽fork子進程的速度就會快。

? ②當fork()之後,kernel把父進程中所有的內存頁的權限都設為read-only,然後子進程的地址空間指向父進程。當父子進程都只讀內存時,相安無事。當其中某個進程寫內存時,CPU硬件檢測到內存頁是read-only的,於是觸發頁異常中斷(page-fault),陷入kernel的壹個中斷例程。中斷例程中,kernel就會把觸發的異常的頁復制壹份,於是父子進程各自持有獨立的壹份。如果使用大頁每次有頁面要修改,那麽就要拷貝壹個2MB的大頁面,會大幅增加重Redis寫期間父進程內存消耗。同時每次寫命令引起的復制內存頁單位為2MB,會拖慢寫操作的執行時間,導致大量寫操作慢查詢,

所以除了“透明大頁與傳統HugePages聯用會出現壹些問題,導致性能問題和系統重啟"外,上面這兩點是Redis建議關閉THP的更重要的原因。

  • 上一篇:中國的飲食文化對中國的文化有什麽影響?
  • 下一篇:書法進校園宣傳口號
  • copyright 2024吉日网官网