Linux 內核參數


/proc/sys/net/ipv4:

  • ip_local_port_range:限制了作為TCP或UDP對目標發起連接所選擇的本地端口范圍,其定義受內核版本影響。具體可以參見net.ipv4.ip_local_port_range 的值究竟影響了啥
  • ip_forward:允許本機路由轉發。特別在容器環境下需要開啟該功能
  • tcp_window_scaling:表示是否啟用TCP窗口因子。窗口因子只能位於TCP SYN/SYN_ACK報文選項中。window size在TCP首部只占16字節,最大為2^16=65536,相對於現代系統來說太小了,使用窗口因子可以增加TCP接收窗口(rwnd,即tcpdump顯示的win)大小,窗口因子最大值為14(RFC1323),計算邏輯為:window_size*(2^tcp_window_scaling),因此接收窗口最大為2^16*2^14=1GB。TCP 建鏈報文中的窗口因子計算方式如下,如sysctl_tcp_rmem[2]=6291456時,窗口因子為7
 1     if (wscale_ok) {
 2         /* Set window scaling on max possible window
 3          * See RFC1323 for an explanation of the limit to 14
 4          */
 5         space = max_t(u32, sysctl_tcp_rmem[2], sysctl_rmem_max);
 6         space = min_t(u32, space, *window_clamp);
 7         while (space > 65535 && (*rcv_wscale) < 14) {
 8             space >>= 1;
 9             (*rcv_wscale)++;
10         }
11     }

對於TCP的初始接收窗口大小,linux和centos的實現是不一樣的,如linux內核3.10版本的初始接收窗口定義為10mss,但centos 3.10內核中的初始窗口大小定義為TCP_INIT_CWND * 2,即20*MSS大小。(看着linux源碼在centos7.4系統上測試,糾結了好久。。)

net/ipv4/tcp_output.c
u32 tcp_default_init_rwnd(u32 mss)
{
        /* Initial receive window should be twice of TCP_INIT_CWND to
         * enable proper sending of new unsent data during fast recovery
         * (RFC 3517, Section 4, NextSeg() rule (2)). Further place a
         * limit when mss is larger than 1460.
         */
        u32 init_rwnd = TCP_INIT_CWND * 2;

        if (mss > 1460)
                init_rwnd = max((1460 * init_rwnd) / mss, 2U);
        return init_rwnd;
}

/* TCP initial congestion window as per draft-hkchu-tcpm-initcwnd-01 */
/* TCP initial congestion window as per draft-hkchu-tcpm-initcwnd-01 */
#define TCP_INIT_CWND           10

ps:cwnd為擁塞窗口大小,表示一個RTT時間內可以發送的報文的個數,2.6.32內核之后的初始值設置為TCP_INIT_CWND,可以使用ss -it查看實時狀態。

  • tcp_rmem:調節(tcp_moderate_rcvbuf)並限制TCP接收緩存區。包含3個值,第一個值是為每個socket接收緩沖區分配的最少字節數;第二個值是默認值(該值會覆蓋net.core.rmem_default。較大的默認值會浪費內存,影響性能),緩沖區在系統負載不重的情況下可以增長到這個值;第三個值是接收緩沖區空間的最大字節數。通過查看源碼發現TCP socket接收緩存區的最大值僅在通過SO_RCVBUF設置的時候才會受net.core.rmem_max限制。tcp_rmem影響TCP建鏈時的窗口因子以及socket接收緩存大小。
  • tcp_adv_win_scale:用於划分網絡緩存區和應用緩存區的比例。內核將 socket 接收緩沖區會划分為網絡緩沖區和應用緩沖區,網絡緩沖區及通常所提到的數據,而應用緩沖區為 skb 頭部一類的數據。具體划分比率主要依賴 sysctl 中設置的 tcp_select_initial_window,tcp_adv_win_scale 大於 0 時,網絡緩沖區(即socket最大接收窗口)的計算邏輯為 space - (space >> tcp_adv_win_scale);否則計算邏輯為 space>>(-tcp_adv_win_scale)  (本段描述來自這里)。
static inline int tcp_win_from_space(int space)
{
    return sysctl_tcp_adv_win_scale<=0 ?
        (space>>(-sysctl_tcp_adv_win_scale)) :
        space - (space>>sysctl_tcp_adv_win_scale);
}

/* Note: caller must be prepared to deal with negative returns */ 
static inline int tcp_space(const struct sock *sk)
{
    return tcp_win_from_space(sk->sk_rcvbuf -
                  atomic_read(&sk->sk_rmem_alloc));
} 
  • tcp_app_win:tcp_adv_win_scale划分出來的應用緩存區保留的字節數,參見Linux網絡相關參數
  • tcp_wmem:限制TCP發送緩存區大小,包含3個值。第一個值是為每個socket發送緩沖區分配的最少字節數;第二個值是默認值(該值會覆蓋wmem_default),緩沖區在系統負載不重的情況下可以增長到這個值;第三個值是發送緩沖區空間的最大字節數。不建議修改。
  • tcp_mem:限制總的TCP緩存區的大小。包含3個以頁(4k字節)為單位的值,意義與上面類似。不建議修改
  • tcp_moderate_rcvbuf:默認開啟,用於自動調節發送/接收緩存區大小,初始值為tcp_rmem和tcp_wmem的默認值。不能大於tcp_rmem[2]
  • tcp_keepalive_time:TCP保活時間,默認2小時
  • tcp_keepalive_intvl:保活報文發送周期,默認90秒
  • tcp_keepalive_probes:保活報文發送次數。keepalive routine每2小時(7200秒)啟動一次,發送第一個probe(探測包),如果在75秒內沒有收到對方應答則重發probe,當連續9個probe沒有被應答時,認為連接已斷
  • tcp_max_syn_backlog:TCP半連接隊列大小,隊列中的連接處理SYN-RECV狀態(即為接收到對端的ACK報文)。表示可以保存的未完成TCP握手的連接的數目。下圖來自這篇博客,建鏈完成后連接會轉移到LISTEN backlog中。當該隊列滿后,會直接丟棄SYN報文。

當tcp_syncookies設置為1后,當半連接隊列滿時,將不會丟棄SYN,而是會返回一個帶有cookie的SYN/ACK報文。

位於syn backlog中的連接狀態為SYN_RECV,可以通過如 netstat -antp|grep SYN_RECV|wc -l 查看當前處於syn backlog中的連接的數目。可以通過nstat -az TcpExtListenDrops查看是否有因為syn backlog滿而丟棄的報文(如syn攻擊)。更多參見另一篇博文

  • tcp_syncookies:當啟動sync cookies功能后,當syn backlog隊列滿時,系統不會丟棄新的SYN報文,而是會發送syncookie報文來校驗是否是正常的連接,主要用於防止syn flood攻擊。下圖來自SYN-Cookies,可以看到syn cookies充當了類似連接緩存的作用。syncookie的方式修改了正常的TCP交互,可能在高負荷的服務器下出現一些問題,如計算cookie的hash會加重CPU負擔,不支持某些TCP選項等。官方並不建議將該參數作為性能調參,而推薦使用tcp_max_syn_backlog, tcp_synack_retries, 和 tcp_abort_on_overflow。

開啟tcp_syncookies時通常需要開啟tcp_timestamps,用來將tcp選項編碼到時間戳中。如下圖可以看到窗口因此wscale編碼在時間戳中,不啟用時間戳將無法使用該選項。

 

  • tcp_abort_on_overflow:在TCP全連接隊列(net.core.somaxconn)滿之后,當新的連接到來之后會丟棄握手階段的最后一個ack(值為0)報文;或發送rst(值為1)報文直接斷鏈。默認值為0。只有在確認服務端長時間內無法處理新連接的情況下才會置為1,否則置為1會影響客戶端使用。當全連接隊列滿且該值為0的情況下,客戶端會根據net.ipv4.tcp_synack_retries繼續嘗試建立連接。
  • tcp_timestamps:默認打開。enable時間戳會啟用Round Trip Time Measurement (RTTM) 和Protect Against Wrapped Sequences (PAWS)功能,前者用於計算rto;后者用於解決高帶寬下的序列號回環問題,使用時間戳作為維度來判斷數據包是否有效。啟用時間戳功能可以提高系統性能。tcp_timestamps可以用於NAT環境,並不會對連接造成影響,只有tcp_timestamps與tcp_tw_recycle同時啟用時才會在NAT環境下導致連接超時。如下圖,假設server啟用了tcp_timestamps與tcp_tw_recycle,2個client通過NAT連接到一個server,此時對server來說,client1和client2的地址都變成了NAT后的地址。當server主動斷開與client的TCP連接,如果在client1鍛煉后的TCP_PAWS_MSL時間內,client2發起連接,但client2的SYN報文的timestamps小於先前server保存的時間戳,會導致該SYN報文被丟棄,而不回復任何報文,最后client2會timeout。參見stackoverflow的這篇文章。單獨timestamp功能不會導致此問題

  • tcp_timestamps必須在兩端同時開啟的情況下才會生效。
  • tcp的timestamp功能是在TCP握手階段協商的。
  • tcp timestamp的
  • tcp_tw_recycle:默認關閉,僅在tcp_timestamps開啟條件下生效,用於server端在一個rto時間內快速回收TIME_WAIT狀態的socket。生產環境建議關閉。內核 4.12 之后已移除: remove tcp_tw_recycle。更多參考這里
  • tcp_tw_reuse:默認關閉,僅在tcp_timestamps開啟條件下生效,僅使適用於客戶端復用處於TIME-WAIT狀態(超過1s)的socket。主要用於客戶端高並發測試場景,減少socket消耗。
  • tcp_fin_timeout:FIN_WAIT_2狀態的時長
  • tcp_max_tw_buckets:限制了處理TIME_WAIT狀態的連接的數目。多余的連接會直接釋放。
  • tcp_syn_retries:TCP建鏈時syn報文的重傳次數,默認為6,即syn報文最多發送7次,重傳間隔為2<<(n-1)秒。
  • tcp_synack_retries:設置了TCP建鏈時syn-ack報文的重傳次數,重傳間隔為2<(n-1)秒
  • tcp_retries1:默認3。當TCP數據重傳超過這個值計算出的超時時間后(見retries2),會進行刷新底層路由的操作,防止由於網絡鏈路發生變化而導致TCP傳輸失敗
  • tcp_retries2:默認15。(如果socket設置了TCP_USER_TIMEOUT參數,則TCP數據重傳超時由該參數決定,不受tcp_retries2控制)。總的重傳超時時間通過如下方式計算得出,其中變量boundary對應的就是tcp_retries1或tcp_retries2的值。可以看到tcp_retries1和tcp_retries2其實計算的是最大超時時間,而不是重傳次數。

linear_backoff_thresh用於計算使用/不使用指數退避算法的超時時間點,ilog2(TCP_RTO_MAX / rto_base)就是求底數為2,反對數為(120000/200)的整數,值為9,即當總的重傳時間小於(2<<9-1)*200ms=204.6s時,重傳間隔時間使用指數退避方式;當總的重傳時間大於204.6時,后續重傳時間為TCP_RTO_MAX,即120s。

按照如下方式可以計算出,tcp_retries2=15時,最大超時時間為(2<<9-1)*0.2+(15-9)*120=924.6s,即當總的重傳時間大於924.6s后,停止重傳。

重傳次數受路由rto影響,可以使用使用如下方式設置一條連接的rto_min,非200ms時可能會使得總的重傳次數大於或小於15。(可以使用ss -i查看TCP連接上的rto大小)

ip route add src_ip/32 via dst_ip rto_min $rto
//內核源碼net/ipv4/tcp_timer.c
static
unsigned int tcp_model_timeout(struct sock *sk, unsigned int boundary, unsigned int rto_base) { unsigned int linear_backoff_thresh, timeout;    linear_backoff_thresh = ilog2(TCP_RTO_MAX / rto_base); if (boundary <= linear_backoff_thresh) timeout = ((2 << boundary) - 1) * rto_base; else timeout = ((2 << linear_backoff_thresh) - 1) * rto_base + (boundary - linear_backoff_thresh) * TCP_RTO_MAX; return jiffies_to_msecs(timeout); }
    • tcp_max_orphans:系統所能維護的孤兒socket(不與任何文件描述符關聯)的最大數目(可以通過ss -s命令查看當前tcp的orphan socket數目)。當orphan socket數目超過該值后,會通過reset來關閉連接。每個orphan socket會占用64Bb且不可swap的內存。該參數可以用於防止DDoS攻擊。可以查看netstat的TcpExtTCPAbortOnMemory統計信息。
    • tcp_orphan_retries:規定了orphan socket的重傳次數。減小該值可以快速回收orphan socket。net.ipv4.tcp_orphan_retries的默認值為0,內核計算時會重置為8。orphan socket為調用內核tcp_close(struct sock *sk, long timeout)函數產生的。orphan socket包含FIN_WAIT1、LAST_ACK、CLOSING(同時關閉)狀態的socket(TIME_WAIT狀態不屬於orphan socket--實測驗證)。更多詳細參見這篇博文
    • tcp_sack:用於提高重傳多個報文時的速率(重傳特定報文),sack的缺點可以查看When to turn TCP SACK off?
    • tcp_ecn:配合中間路由器實現感知中間路徑的擁塞,並主動減緩TCP的發送速率,從而從早期避免擁塞而導致的丟包,實現網絡性能的最大利用。網絡中的路由器按照1999年的ECN草案方案實現,將只識別ECN=10的報文作為支持ECN功能,而不識別ECN=01的報文,這類路由器可能將ECN=01的報文將按照ECN=00的行為處理,最后進行RED丟包。但並不影響網絡的正常功能默認值為2(即二進制10)。參考不要亂用 TCP ECN flag
    • tcp_fastopen:TCP Fast Open(TFO)是用來加速連續TCP連接的數據交互的TCP協議擴展,原理如下:在TCP三次握手的過程中,當用戶首次訪問Server時,發送SYN包,Server根據用戶IP生成Cookie(已加密),並與SYN-ACK一同發回Client;當Client隨后重連時,在SYN包攜帶TCP Cookie;如果Server校驗合法,則在用戶回復ACK前就可以直接發送數據;否則按照正常三次握手進行。其中1表示客戶端開啟,2表示服務端開啟,3表示客戶端和服務器同時開啟。在高版本的Linux中,默認為1
    • tcp_reordering:通知內核在一條TCP中需要重組的報文數目,此時不考慮報文丟失。如果大於該值,會認為有報文丟失,TCP棧會自動切換到慢啟動。默認3
    • tcp_fack:基於sack的擁塞避免控制。
    • tcp_challenge_ack_limit:每秒發送的挑戰報文(challenge ack用於防止Blind In-Window Attacks,分為接收到數據,RST報文,SYN報文的處理,用於避免盲數據注入和斷鏈攻擊)的數量,默認1000。參見TCP挑戰ACK報文限速
  • tcp_invalid_ratelimit:用於控制響應如下無效TCP報文的重復ACK報文的最大速率(挑戰ACK受此限制),默認500ms:
    1. 無效的序列號
    2. 無效的確認號
    3. PAWS 校驗失敗
  • tcp_limit_output_bytes:用於控制TCP Small Queue隊列長度,TSQ屬於Qdisc的一種。
  • tcp_autocorking:是否允許TCP auto corking。在進行一些小的寫操作時,如果此時Qdisc或驅動的傳輸隊列中已經有至少一個報文,此時會合並發送,用以減小發送的報文數量。默認允許。socket可以使用TCP_CORK 參數來取消或允許該特性

參考:

 

/proc/sys/net/core:

  • somaxconn:TCP LISTEN backlog 隊列大小,默認128。表示掛起的(未被accept處理的)請求的最大數目。可以通過listen函數的第二個參數指定int listen(int sockfd, int backlog) ,如果設置的backlog值大於net.core.somaxconn值,將被置為net.core.somaxconn值大小。可以使用ss -ntl 查看當前LISTEN backlog隊列長度以及隊列中待處理的連接長度。如下面表示LISTEN backlog長度為128,當前有1個連接待(accept)處理。LISTEN backlog隊列滿之后的動作與net.ipv4.tcp_abort_on_overflow相關。
# ss -ntl
State      Recv-Q Send-Q            Local Address:Port                      Peer Address:Port
LISTEN     1      128               :::19090                                :::*
  • rmem_default:設置了TCP/UDP/Unix等socket的接收緩存區默認值,由內核自動調整,不建議修改。TCP下設置為net.ipv4.tcp_rmem的默認值
  • wmem_default:設置了TCP/UDP/Unix等socket的發送緩存區默認值,由內核自動調整,不建議修改。TCP下設置為net.ipv4.tcp_wmem的默認值
  • rmem_max:設置了TCP/UDP/Unix等socket的接收緩存區的上限值。rmem_max的作用如下:
    • 限制通過socket選項SO_RCVBUF設置(sock_setsockopt)的接受緩存區的大小
    • 用於計算TCP建鏈的窗口因此(參見本文tcp_window_scaling描述)

更多參見TCP receiving window size higher than net.core.rmem_max

  • wmem_max:設置了TCP/UDP/Unix等socket的發送緩存區的上限值

參考:

 

/proc/sys/net/netfilter:

  • nf_conntrack_acct:enable該值后會在/proc/net/nf_conntrack的條目中增加連接交互的總package count和總package bytes參數。參見What does nf_conntrack.acct really do?
  • nf_conntrack_timestamp:enable該值后會在/proc/net/nf_conntrack的條目中增加連接存活累計時間(單位s)參數delta-time。
  • nf_conntrack_buckets:只讀文件,表示HASHSIZE。系統啟動后無法修改,但可以通過如下方式修改。
echo 16384 > /sys/module/nf_conntrack/parameters/hashsize
  • nf_conntrack_max:設置連接跟蹤數的最大值,當系統達的連接跟蹤數達到該值后,再創建連接跟蹤時會報“nf_conntrack: table full, dropping packet”錯誤。由於連接跟蹤數比較占內存,因此不能盲目增加該值大小。nf_conntrack_max=HASHSIZE*(bucket size),(bucket size)默認為4。bucket size不能直接修改,只能通過修改nf_conntrack_max/nf_conntrack_buckets的比值來間接修改。

 /proc/net/nf_conntrack中的兩個特殊字段含義如下:

    • [ASSURED]: 在兩個方面(即請求和響應)方向都看到了流量。
    • [UNREPLIED]: 尚未在響應方向上看到流量。如果連接跟蹤緩存溢出,則首先刪除這些連接。
  • nf_conntrack_count:當前使用的連接跟蹤數目,只讀。
  • sysctl -a | grep conntrack | grep timeout可以看出與各個協議狀態相關的timeout時間。以TCP為例,如下參數描述了TCP各個狀態的nf_conntrack的生存時間,如nf_conntrack_tcp_timeout_established的值為432000s(5days),表示處於建鏈狀態的TCP的最大生存時間為5天,超時后會移除該連接跟蹤數。在NAT場景下,移除連接跟蹤將會導致連接中斷(但不會通知兩端)。非NAT場景下,其連接跟蹤僅僅用於記錄當前連接情況,移除這種情況下的連接跟蹤不會對鏈路造成影響。設置如下參數時最好將設置值大於等於系統或協議規定的參數大小,否則可能導致鏈路異常。
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 432000
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300

參考

 

/proc/sys/vm:

  • vfs_cache_pressure:控制內核回收directory和inode的回收速率,當降低該值會使得內核保留dentry和inode caches,當vfs_cache_pressure=0時,內核不會回收dentry和inode caches,這種情況下可能會導致內存泄漏。增加該值可能會影響系統性能,但會加快回收dentry和inode caches,可以通過slabtop命令查看dentry/inode caches的數值。參見記一次內存使用率過高的報警
  • dirty_background_ratio:默認10,以比例規定內存臟數據最大值,dirty_background_ratio和dirty_background_bytes只能選擇一種,即一個為非0,則另一個為0。當對數據的一致性要求比並發處理更高時,可以將該值調低
  • dirty_background_bytes:默認0,以具體數值規定內存臟數據最大值
  • dirty_writeback_centisecs:默認500,即5s,內存臟數據寫回周期,系統以該周期定時啟動pdflush/flush/kdmflush線程來將臟數據寫會到磁盤。如果IO繁忙時,可能會啟動多個flush線程。需要注意的是,flush對應的臟數據不一定會從內存中釋放(見下)。
  • dirty_expire_centisecs:默認3000,即30s,臟數據在內存中停留的最長時間,當超過該時間后,臟數據會在下一次寫回到磁盤。
    • 臟數據在內存停留條件為:
      • a:dirty_expire_centisecs時間以內
      • b:臟數據沒有超過dirty_background_ratio閾值
    • dirty_ratio:默認30,內存中臟數據占總可用(available)內存的最大比例,當超過該值后系統會執行寫回操作並阻塞所有進程的IO寫操作,直到臟數據小於dirty_ratio。
    • kswapd會在可用內存低於zone設置的low時執行內存回收。當可用內存低於zone的min時會觸發內核直接回收機制(OOM)。low值通過/proc/vm/min_free_kbytes設置。pdflush用於周期性地將臟數據寫回到磁盤,當臟數據大於dirty_background_ratio或dirty_background_bytes時會觸發IO阻塞,kswapd和pdflush在某些功能上會有一些耦合,kswapd用於緩存管理,包含內存的swap out和page out,page cache的回收,而pdflush僅用於回收dirty cache。具體參見kswapd和pdflush

參考:

/proc/sys/net/bridge:

  • bridge-nf-call-arptables:表示arptables是否可以過濾bridge接口的報文。
  • bridge-nf-call-ip6tables:表示ip6tables是否可以過濾bridge接口的報文
  • bridge-nf-call-iptables:表示iptables是否可以過濾二層bridge接口的報文。iptables既能處理三層報文也能處理二層報文,bridge環境下使能該選項,可能會導致二層網絡問題。注意下圖中的"bridge check"處理節點。ps:ebtables用於對以太網幀的過濾,iptables用於對ip數據包的過濾

參考:

/proc/sys/fs:

  • file-max:內核可以分配的文件句柄的最大值。當遇到如“VFS: file-max limit <number> reached"錯誤時,說明該值過低,可以調整上限。該值通常由內核確定,為內存的10%左右
  • file-nr:描述了內核文件句柄的使用情況。第一個值表示當前分配的文件句柄的數目;第二個表示已經分配但未使用的文件句柄的數目;第三個值表示可分配的文件句柄的最大值。
  • nr_open:限制了單個進程可以打開的文件描述符的上限。關系為:ulimit -Sn <= ulimit -Hn <= cat /proc/sys/fs/nr_open

需要注意的是進程可打開的文件描述符的最大數目並不一定等於ulimit -Sn,如進程可以通過systemd的LimitNOFILE參數來設置其soft值。可以在/proc/$pid/limits中查看進程的ulimit值,也可以直接修改該值來修改進程的ulimit限制。

需要注意內核文件句柄和文件描述符的區別,文件描述符為用戶層面的內容,可以使用lsof或在/proc/$pid/fd中查看程序打開的文件描述符。而內核文件句柄的使用情況需要查看內核參數file-nr。更多可以參考這篇文章。

內核文件句柄可以通過如下方式申請,當共享內存使用結束后需要卸載共享內容(如mmap/munmap,shmat/shmctl($shmid, IPC_RMID, NULL)),否則會導致內核文件句柄泄露(內核句柄通過引用計數來判斷是否刪除該文件句柄)。

  • open系統調用打開文件(path_openat內核函數)
  • 打開一個目錄(dentry_open函數)
  • 共享內存attach (do_shmat函數)
  • socket套接字(sock_alloc_file函數)
  • 管道(create_pipe_files函數)
  • epoll/inotify/signalfd等功能用到的匿名inode文件系統(anon_inode_getfile函數)

參考:

/proc/sys/kernal:

  • sched_rt_period_us:該文件中的值指定了等同於100% CPU寬度的調度周期。取值范圍為1到INT_MAX,即1微秒到35分鍾。默認值為1000,000(1秒)
  • sched_rt_runtime_us:該文件中的值指定了實時和deadline調度的進程可以使用的"period"(sched_rt_period_us)。取值范圍為-1到INT_MAX-1,設置為-1標識運行時間等同於周期,即沒有給非實時進程預留任何CPU。默認值為950,000(0.95秒),表示給非實時或deadline調度策略保留5%的CPU。sched_rt_period_us和sched_rt_runtime_us都與實時調度有關。
  • sched_cfs_bandwidth_slice_us:設置系統層面的CPU帶寬(即可占用的CPU時間),默認5ms。進程的CPU帶寬可以通過cgroup的cpu.cfs_quota_us和cpu.cfs_period_us設置。
  • sched_latency_ns:所有任務至少被調度一次所用的時長。
  • sched_min_granularity_ns:保證一個任務在被搶占之前允許運行的最小時間片長度
    • If number of runnable tasks does not exceed sched_latency_ns/sched_min_granularity_ns
          scheduler period = sched_latency_ns
      else
          scheduler period = number_of_running_tasks * sched_min_granularity_ns

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM