2019年8月19日 星期一

Linux memory setting.


root@OCTEONTX:/home/horatio# sysctl -a |grep vm
vm.admin_reserve_kbytes = 8192
vm.block_dump = 0
vm.compact_unevictable_allowed = 1
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500
vm.dirtytime_expire_seconds = 43200
vm.drop_caches = 0
vm.extfrag_threshold = 500
vm.hugepages_treat_as_movable = 0
vm.hugetlb_shm_group = 0
vm.laptop_mode = 0
vm.legacy_va_layout = 0
vm.lowmem_reserve_ratio = 256   32
vm.max_map_count = 65530
vm.min_free_kbytes = 829120
vm.min_slab_ratio = 5
vm.min_unmapped_ratio = 1
vm.mmap_min_addr = 32768
vm.mmap_rnd_bits = 14
vm.nr_hugepages = 0
vm.nr_hugepages_mempolicy = 0
vm.nr_overcommit_hugepages = 0
vm.nr_pdflush_threads = 0
vm.numa_zonelist_order = default
vm.oom_dump_tasks = 1
vm.oom_kill_allocating_task = 0
vm.overcommit_kbytes = 0
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
vm.page-cluster = 3
vm.panic_on_oom = 0
vm.percpu_pagelist_fraction = 0
vm.stat_interval = 1
vm.swappiness = 60
vm.user_reserve_kbytes = 131072
vm.vfs_cache_pressure = 100
vm.watermark_scale_factor = 10
vm.zone_reclaim_mode = 1

**  手動清除 Linux 記憶體快取
    若寫入 1 會清除 pagecache:
    # echo 1 > /proc/sys/vm/drop_caches
    若寫入 2 會清除 dentries 與 inodes:
    # echo 2 > /proc/sys/vm/drop_caches
    若寫入 3 則有等同於 1+2 的效果,會清除 pagecache、dentries 及 inodes:
    # echo 3 > /proc/sys/vm/drop_caches
   
**  overcommit_memory
    定義接受或拒絕大型記憶體需求的狀況。此參數有三種可用值:
    0 — 預設設定。kernel 會進行探索式的記憶體過度寫入處理,方法是預測記憶體的可用量、並讓公然違規的需求失敗。不幸的是,因為記憶體是以探索式、而非精準的演算法則來分配,因此這設定有時會過度使用系統上的可用記憶體。
    1 — kernel 不進行記憶體過度寫入處理。在此設定下,過度使用記憶體的機會會增加,但對於頻繁存取記憶體的任務來說,效能也會增加。
    2 — kernel 拒絕相等或大於總可用置換空間與實體記憶體比例(於 overcommit_ratio 指定)的記憶體需求。如果您想要降低記憶體過度寫入的風險,這是最佳設定。 

**  vfs_cache_pressure 可以控制系統清除cache的頻率.
    數值設定低會導致內核傾向於保留dentry和inode於記憶體中.
    高就會提高清除重建的頻率.
    cat /proc/sys/vm/vfs_cache_pressure
    sysctl vm.vfs_cache_pressure=50
    sysctl vm.vfs_cache_pressure=10000
   
**  vm.dirty_background_ratio 這個參數主要是降低 Linux 寫檔案(dirty page)的 buffer 大小,
    如果是寫入的量很大的系統建議降低此值,
    這樣會讓寫入更連續而且一致,而不會分批次每次都寫入大量的資料.
    sysctl vm.dirty_background_ratio=1
    您可藉由編輯 /etc/sysctl.conf 檔案來永久性地更改這些參數的值

**  vm.dirty_writeback_centisecs 單位是百分之一秒,這個就是多久要觸發回寫
    sysctl vm.dirty_writeback_centisecs

**  vm.dirty_expire_centisecs = 1000 單位也是百分之一秒,
    這個是表示 dirty page 過了多久之後下次 pdflush kernel thread 醒來時就會被寫回硬碟,
    預設是 3000 也就是 30 秒,一樣可以設低一點讓寫入均勻化,不過太低會一直寫,也不宜太低。

** Zone_reclaim_mode
       該參數只有在啟用CONFIG_NUMA選項時才有效。
       允許某人在區域內存不足時設置或多或少的積極方法來回收內存。
       如果設置為零,則不會發生區域回收。
       將從系統中的其他區域/節點滿足分配
       zone_reclaim_mode用來控制在內存域OOM時,如何來回收內存。
       如果設置為0,則禁止內存域回收,從系統中其他內存域或節點來滿足內存分配請求。
       這個參數可以使用下面的值通過或運算來設置:
        1  = 啟用內存域回收    => OK
        2  = 刷臟頁回收內存
        4  = 通過swap回收內存
      如果檢測到從其他內存域分配內存會造成性能下降,啟動的時候會將zone_reclaim_mode設置為1。
      頁面分配器在從節點分配頁面前,會先回收容易重用的頁面(當前未使用的pagecache頁面)。
      如果系統是用作文件服務器,所有的內存都可以用作緩存磁盤上的文件,這種情況下關閉內存域回收是有好處的,緩存的作用要比數據的局部性作用大。
      通過刷臟頁進行內存域回收,會阻止寫入大量數據的進程在其他節點上產生臟頁。
      如果內存域填滿了,會刷出臟頁釋放內存,因此可以使進程節流。
      這可能會降低單個進程的性能,因為它不能使用系統所有的內存來緩衝寫入的數據,但是使用其他節點的進程不會受到影響。
      通過swap釋放內存可以將分配嚴格限制在本地節點,除非明確使用了特定的內存策略或綁定設置來覆蓋這個設置。

沒有留言:

張貼留言