/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:
- 無效的序列號
- 無效的確認號
- PAWS 校驗失敗
- tcp_limit_output_bytes:用於控制TCP Small Queue隊列長度,TSQ屬於Qdisc的一種。
- tcp_autocorking:是否允許TCP auto corking。在進行一些小的寫操作時,如果此時Qdisc或驅動的傳輸隊列中已經有至少一個報文,此時會合並發送,用以減小發送的報文數量。默認允許。socket可以使用TCP_CORK 參數來取消或允許該特性
參考:
- Linux之TCPIP內核參數優化
- TCP protocol
- Tuning TCP - sysctl.conf
- 聊一聊重傳次數
- TCP timestamp
- TCP SOCKET中backlog參數的用途是什么? ---圖解
- Coping with the TCP TIME-WAIT state on busy Linux servers
- SYN Flood攻擊及防御方法
- TCP SYN-Cookie的原理和擴展
- TCP 接收窗口
/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
-