2019年8月19日 星期一

Linux 指令!


** cifs 
sudo apt-get install cifs-utils
mount -t cifs //10.10.8.152/root/Vicom /VersaPLX -o username=root,password=accusys,vers=1.0

linux I/O優化設定參數!

查看關於 buffers cache 緩存的信息
cat /proc/meminfo  or free -wh

其中的Cached指用於pagecache的內存大小(diskcache-SwapCache)。
隨著寫入緩存頁,Dirty的值會增加。
一旦開始把緩存頁寫入硬盤,Writeback的值會增加直到寫入結束。

Linux用pdflush進程把數據從緩存頁寫入硬盤,查看有多少個pdflush進程
cat /proc/sys/vm/nr_pdflush_threads

pdflush的行為受/proc/sys/vm中的參數的控制
/proc/sys/vm/ dirty_writeback_centisecs (default 500 (0.01秒)): 
多長時間喚醒pdflush將緩存頁數據寫入硬盤。默認5秒喚醒2個(更多個)線程。
如果wrteback的時間長於dirty_writeback_centisecs的時間,可能會出問題。

pdflush的第一件事是讀取
/proc/sys/vm/dirty_expire_centiseconds (default 3000 (0.01秒))
緩存頁里數據的過期時間(舊數據),在下一個週期內被寫入硬盤。默認30秒是一個很長的時間。

第二件事是判斷內存是否到了要寫入硬盤的限額,由參數決定:
/proc/sys/vm/dirty_background_ratio (default 10)
百分值,保留過期頁緩存(臟頁緩存)的最大值。是以MmeFree+Cached-Mapped的值為基準的

pdflush寫入硬盤看兩個參數:
1數據在頁緩存中是否超出30秒,如果是,標記為臟頁緩存;
2臟頁緩存是否達到工作內存的10%;

以下參數也會影響到pdflush
/proc /sys/vm/dirty_ratio (default 40)
總內存的最大百分比,系統所能擁有的最大臟頁緩存的總量。超過這個值,開啟pdflush寫入硬盤。
如果cache增長快於pdflush,那麼整個系統在40%的時候遇到I/O瓶頸,所有的I/O都要等待cache被pdflush進硬盤後才能重新開始。

對於有高度寫入操作的系統
dirty_background_ratio:主要調整參數。如果需要把緩存持續的而不是一下子大量的寫入硬盤,降低這個值。
dirty_ratio:第二調整參數。

Swapping參數
/proc/sys/vm/swappiness
默認,linux傾向於從物理內存映射到硬盤緩存,保持硬盤緩存盡可能大。未用的頁緩存會被放進swap區。
數值為0,將會避免使用swapping
100,將會盡量使用swapping
少用swapping會增加程序的響應速度;多用swapping將會提高系統的可用性。

如果有大量的寫操作,為避免I/O的長時間等待,可以設置:
$ echo 5 > /proc/sys/vm/dirty_background_ratio
$ echo 10 > /proc/sys/vm/dirty_ratio

文件系統數據緩衝需要頻繁的內存分配。加大保留內存的值能提升系統速度和穩定。小於8G的內存,保留內存為64M,大於8G的設置為256M
$ echo 65536 > /proc/sys/vm/min_free_kbytes


I/O調度器
cat /sys/block/[disk]/queue/scheduler 

調度算法
** noop deadline [cfq] 
    deadline: deadline算法保證對既定的IO請求以最小的延遲時間。
    cfq: 對每個進程維護一個IO隊列,各個進程發來的IO請求會被cfq以輪循方式處理,對每一個IO請求都是公平。適合離散讀的應用。
    noop: 對所有IO請求都用FIFO隊列形式處理。默認IO不會存在性能問題。

改變調度器
$ echo deadline > /sys/block/sdX/queue/scheduler
對於數據庫服務器,deadline算法是推薦的。

提高調度器請求隊列的
$ echo 4096 > /sys/block/sdX/queue/nr_requests

有大量的讀請求,默認的請求隊列應付不過來,可以提高這個值。缺點是要犧牲一定的內存。
為了增加連續讀取的吞吐量,可以增加預讀數據量。預讀的實際值是自適應的,所以使用一個較高的值,不會降低小型隨機存取的性能。
$ echo 4096 > /sys/block/sdX/queue/read_ahead_kb
如果LINUX判斷一個進程在順序讀取文件,那麼它會提前讀取進程所需文件的數據,放在緩存中。
 

服務器遇到磁盤寫活動高峰,導致請求處理延遲非常大(超過3秒)。
通過調整內核參數,將寫活動的高峰分佈成頻繁的多次寫,每次寫入的數據比較少。這樣可以把尖峰的寫操作削平成多次寫操作。
以這種方式執行的效率比較低,因為內核不太有機會組合寫操作。但對於繁忙的服務器,寫操作將更一致地進行,並將極大地改進交互式性能。
/proc/sys/vm/dirty_ratio
控製文件系統的寫緩衝區的大小,單位是百分比,表示佔系統內存的百分比,表示當寫緩衝使用到系統內存多少的時候,開始向磁盤寫出數據。
增大之會使用更多系統內存用於磁盤寫緩衝,也可以極大提高系統的寫性能。但是,當你需要持續、恆定的寫入場合時,應該降低其數值。

/proc/sys/vm/dirty_background_ratio
控製文件系統的pdflush進程,在何時刷新磁盤。單位是百分比,表示系統內存的百分比,pdflush用於將內存中的內容和文件系統進行同步,
比如說,當一個文件在內存中進行修改,pdflush負責將它寫回硬盤.每當內存中的垃圾頁(dirty page)超過10%的時候,pdflush就會將這些頁面備份回硬盤.
增大之會使用更多系統內存用於磁盤寫緩衝,也可以極大提高系統的寫性能。但是,當你需要持續、恆定的寫入場合時,應該降低其數值:

/proc/sys/vm/dirty_writeback_centisecs
控制內核的髒數據刷新進程pdflush的運行間隔。單位是1/100秒。缺省數值是500,也就是5秒。如果你的系統是持續地寫入動作,那麼實際上還是降低這個數值比較好,
這樣可以把尖峰的寫操作削平成多次寫操作。
如果你的系統是短期地尖峰式的寫操作,並且寫入數據不大(幾十M/次)且內存有比較多富裕,那麼應該增大此數值。
該參數的設置應該小於dirty_expire_centisecs,但也不能太小,太小I/O太頻繁,反而
使系統性能下降。具體可能需要在生產環境上測試。據說1:6 (dirty_expire_centisecs : dirty_writeback_centisecs )的比例比較好。

/proc/sys/vm/dirty_expire_centisecs
聲明Linux內核寫緩衝區裡面的數據多“舊”了之後,pdflush進程就開始考慮寫到磁盤中去。單位是1/100秒。缺省是30000,也就是30秒的數據就算舊了,
將會刷新磁盤。對於特別重載的寫操作來說,這個值適當縮小也是好的,但也不能縮小太多,因為縮小太多也會導致IO提高太快。
當然,如果你的系統內存比較大,並且寫入模式是間歇式的,並且每次寫入的數據不大(比如幾十M),那麼這個值還是大些的好。

/proc/sys/vm/vfs_cache_pressure
表示內核回收用於directory和inode cache內存的傾向;缺省值100表示內核將根據pagecache和swapcache,把directory和inode cache保持在一個合理的百分比;
降低該值低於100,將導致內核傾向於保留directory和inode cache;增加該值超過100,將導致內核傾向於回收directory和inode cache

/proc/sys/vm/min_free_kbytes
表示強制Linux VM最低保留多少空閒內存(Kbytes)。
缺省設置:724(512M物理內存)

/proc/sys/vm/nr_pdflush_threads
表示當前正在運行的pdflush進程數量,在I/O負載高的情況下,內核會自動增加更多的pdflush進程。

/proc/sys/vm/overcommit_memory
指定了內核針對內存分配的策略,其值可以是0、1、2。
0,表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,並把錯誤返回給應用進程。
1,表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。
2,表示內核允許分配超過所有物理內存和交換空間總和的內存(參照overcommit_ratio)。
缺省設置:0

/proc/sys/vm/overcommit_ratio
如果overcommit_memory=2,可以過載內存的百分比,通過以下公式來計算系統整體可用內存。系統可分配內存=交換空間+物理內存*overcommit_ratio/100
缺省設置:50(%)

/proc/sys/vm/page - cluster
表示在寫一次到swap區的時候寫入的頁面數量,0表示1頁,1表示2頁,2表示4頁。
缺省設置:3(2的3次方,8頁)

/proc/sys/vm/swapiness
表示系統進行交換行為的程度,數值(0-100)越高,越可能發生磁盤交換。

想要開機後長置更改:
vi  /etc/sysctl.conf
add "vm.dirty_ratio = 40"

Linux I / O調度器

**  Linux I / O調度器
    Linux I / O調度器是控制內核提交讀寫請求給磁盤的方式。Linux的支持三種I / O電梯調度算法,分別為CFQ,Noop,Deadline三種。簡單介紹下這三種。

    **CFQ(完全公平調度程序)
    完全公平調度器(CFQ)自kernel2.6.18後成為了Linux默認的I / O調度器,它也是大多數Linux發行版的默認調度器。
    CFQ調度器的目的是為所有請求I / O操作的進程提供一個公平的磁盤I / O帶寬分配。
    CFQ調度器為每個進程單獨創建一個同步I / O隊列來管理其同步的請求然後為每個隊列分配訪問磁盤的時間片。
    時間片長度和隊列允許提交的請求數取決於其進程的I / O優先級。以此保證每個進程的I / O資源佔用是公平的。
    CFQ算法的特點是按照I / O請求的地址進行排序,而不是按照先來後到的順序進行響應。這樣減少了不必要的磁盤尋道,提高了吞吐量。
    但也意味著,先來的I / O請求可能不能盡快得到響應,可能出現餓死現象。

    **Deadline調度器主要目的是保證請求的啟動服務時間。它在所有的I / O請求上加上一個期限來防止請求餓死。
    除了本身提供的I / O排隊隊列之外,Deadline額外分為為讀I / O和寫I / O提供了FIFO隊列。排序隊列按照按照扇區數排序,FIFO隊列按照截止時間排序。
    FIFO隊列優先級高於排隊隊列,讀隊列優先級高於寫隊列。排序隊列使用紅黑樹結構,而FIFO使用鍊錶結構。讀FIFO隊列的最大等待時間為500ms,寫FIFO隊列的最大等待時間為5s。
    截止日期算法會在寫隊列沒有發生飢餓的情況下處理讀隊列,在進入讀隊列處理時,會首先檢查FIFO讀隊列查看是否有過期請求,如果有就優先處理它。
    如果前面寫隊列出現飢餓,意即FIFO寫隊列有過期請求,它就會進入寫隊列處理然後處理FIFO中過期的寫請求。
    截止日期本質還是基於CFQ的,只不過加了兩個FIFO隊列來避免餓死問題。
    Deadline調度器更適合用於多線程處理環境和數據庫環境。避免了CFQ調度器的餓死問題。

    **Noop調度器非常簡單,它提供了一個最簡單的FIFO隊列並對請求進行簡單的合併處理。
    當確定不需要根據扇區號來對請求排序時,這個調度器是非常高效的。比較適合在SSD上面應用。
    總的來看,Noop更適合固態硬盤。截止日期適合需要優先保證讀操作且避免餓死的情況如數據庫場景。
    CFQ比較複雜,容易出現餓死問題,但保證了盡可能的公平。推薦固態硬盤下可以考慮把默認的CFQ調度器改為Noop調度器或者Deadline調度器。

    更換Linux I / O調度器
    可以通過如下命令查看你當前的I / O調度器:
    cat /sys/block/sdb/queue/scheduler or
    for i in `ls /sys/block/*/queue/scheduler`; do echo $i;cat $i; done

    如果想修改的話,可以先進入su然後執行:
    echo noop > /sys/block/sdb/queue/scheduler
    把可以noop換位cfq或者deadline。

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釋放內存可以將分配嚴格限制在本地節點,除非明確使用了特定的內存策略或綁定設置來覆蓋這個設置。

Linux FIO 測試!

Fio  test.fio


**  Fio setting   
[global]

filename=/dev/sdb

ioengine=libaio
#ioengine=sync

#direct=bool
#If value is true, use non-buffered I/O. This is usually O_DIRECT.
#Note that OpenBSD and ZFS on Solaris don’t support direct I/O.
#On Windows the synchronous ioengines don’t support direct I/O. Default: false.
direct=1

time_based
ramp_time=5
refill_buffers
group_reporting
wait_for_previous

#size=200G
runtime=1m

#This option also allows a range of CPUs to be specified
#say you wanted a binding to CPUs 0, 5, and 8 to 15, you would set cpus_allowed=0,5,8-15.
#cpus_allowed=0,1

[JOB1]
bs=1M
rw=read
numjobs=4
iodepth=1

[JOB2]
bs=1M
rw=write
numjobs=8
iodepth=1

#[JOB3]
#bs=4k
#rw=write

#[JOB4]
#bs=32k
#rw=write


root@OCTEONTX:/home/horatio# pstree
systemd-+-agetty
        |-cgmanager
        |-cron
        |-dbus-daemon
        |-dhclient
        |-dnsmasq---dnsmasq
        |-ha_logd---ha_logd
        |-libvirtd---15*[{libvirtd}]
        |-login---bash
        |-multipathd---4*[{multipathd}]
        |-sshd-+-sshd---sshd---bash---sudo---su---bash---fio-+-6*[fio]
        |      |                                             `-{fio}
        |      `-sshd---sshd---bash---sudo---su---bash---pstree
        |-sudo---DTRGuiSrv_64-+-DTRGuiSrv_64
        |                     `-DTRGuiSrv_64---java-+-{C1 CompilerThre}
        |                                           |-2*[{C2 CompilerThre}]
        |                                           |-{Finalizer}
        |                                           |-{Reference Handl}
        |                                           |-{Service Thread}
        |                                           |-{Signal Dispatch}
        |                                           |-{Thread-1}
        |                                           |-{Timer-0}
        |                                           |-{VM Periodic Tas}
        |                                           |-{VM Thread}
        |                                           `-5*[{java}]
        |-systemd---(sd-pam)
        |-systemd-journal
        |-systemd-logind
        |-systemd-timesyn---{sd-resolve}
        |-systemd-udevd
        `-vsftpd

root@OCTEONTX:/home/horatio# pstree -p
systemd(1)-+-agetty(3357)
           |-cgmanager(2898)
           |-cron(2936)
           |-dbus-daemon(2983)
           |-dhclient(3355)
           |-dnsmasq(3601)---dnsmasq(3602)
           |-ha_logd(3095)---ha_logd(3098)
           |-libvirtd(3054)-+-{libvirtd}(3100)
           |                |-{libvirtd}(3101)
           |                |-{libvirtd}(3102)
           |                |-{libvirtd}(3103)
           |                |-{libvirtd}(3104)
           |                |-{libvirtd}(3105)
           |                |-{libvirtd}(3106)
           |                |-{libvirtd}(3107)
           |                |-{libvirtd}(3108)
           |                |-{libvirtd}(3109)
           |                |-{libvirtd}(3113)
           |                |-{libvirtd}(3114)
           |                |-{libvirtd}(3115)
           |                |-{libvirtd}(3116)
           |                `-{libvirtd}(3117)
           |-login(3362)---bash(6028)
           |-multipathd(1664)-+-{multipathd}(1665)
           |                  |-{multipathd}(1666)
           |                  |-{multipathd}(1667)
           |                  `-{multipathd}(1668)
           |-sshd(3072)-+-sshd(6039)---sshd(6048)---bash(6049)---sudo(6578)---su(6579)---bash(6580)---fio(6598)-+-fio(6600)
           |            |                                                                                       |-fio(6601)
           |            |                                                                                       |-fio(6602)
           |            |                                                                                       |-fio(6603)
           |            |                                                                                       |-fio(6604)
           |            |                                                                                       |-fio(6605)
           |            |                                                                                       `-{fio}(6599)
           |            `-sshd(6058)---sshd(6067)---bash(6068)---sudo(6563)---su(6564)---bash(6565)---pstree(6629)
           |-sudo(3075)---DTRGuiSrv_64(3097)-+-DTRGuiSrv_64(3300)
           |                                 `-DTRGuiSrv_64(3301)---java(3302)-+-{C1 CompilerThre}(3316)
           |                                                                   |-{C2 CompilerThre}(3314)
           |                                                                   |-{C2 CompilerThre}(3315)
           |                                                                   |-{Finalizer}(3312)
           |                                                                   |-{Reference Handl}(3311)
           |                                                                   |-{Service Thread}(3317)
           |                                                                   |-{Signal Dispatch}(3313)
           |                                                                   |-{Thread-1}(3545)
           |                                                                   |-{Timer-0}(3546)
           |                                                                   |-{VM Periodic Tas}(3318)
           |                                                                   |-{VM Thread}(3310)
           |                                                                   |-{java}(3305)
           |                                                                   |-{java}(3306)
           |                                                                   |-{java}(3307)
           |                                                                   |-{java}(3308)
           |                                                                   `-{java}(3309)
           |-systemd(6023)---(sd-pam)(6024)
           |-systemd-journal(1660)
           |-systemd-logind(2901)
           |-systemd-timesyn(6240)---{sd-resolve}(6241)
           |-systemd-udevd(2259)
           `-vsftpd(3074)

root@OCTEONTX:/home/horatio# iostat -dx 1
Linux 4.9.0-OCTEONTX_SDK_6_1_0_p3_build_22 (OCTEONTX)   08/19/19        _aarch64_       (24 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.05     0.06    0.06    0.14     4.21     3.87    81.94     0.00    5.24    3.22    6.16   1.17   0.02
sdb               0.00     0.05    0.05    2.46     0.25  1253.47   998.82     0.25   98.53    8.95  100.53   0.72   0.18
sdc               0.00     0.00    0.00    0.00     0.02     0.00   141.20     0.00    0.20    0.20    0.00   0.20   0.00