【運維基礎】Linux 進程調度管理

Linux 進程調度管理

進程調度器

現代計算機系統中既包含只有單個CPU且任何時候都只能處理單個指令的低端系統到具有幾百個cpu、每個cpu有多個核心的高性能超級計算機,可以并行執行幾百個指令。所有這些系統都有一個共同點:系統進程線程數量超出了CPU數量。

Linux系統看起來可以同時執行多個進程,多個進程輪流使用CPU。內核使用進程調度器決定如何分配CPU時間。為了更好地運行,進程調度器必須平衡不同的條件,快速決定下個執行的進程,確保進程獲得公平的CPU時間:

  • 按時間片輪轉(10-20ms為1個時間片 )
  • 按優先級調度,允許高優先級進程獲取更多的共享CPU時間,低優先級進程獲取更少的共享CPU時間。

在這里插入圖片描述

在這里插入圖片描述

實時調度器

實時調度器支持的調度策略:

  • SCHED_RR,roundrobin 輪訓調度策略。相同優先級的進程輪流獲取相同的CPU時間。
  • SCHED_FIFO,先入先出調度策略。被分配到的CPU時間的進程會一直運行,直到被IO阻塞(也稱為sched_yield),會被高優先級進程搶占。

實時調度器管理的進程運行優先級范圍如下:

在這里插入圖片描述

即使系統運行實時調度程序,也要保持可響應狀態,至少ssh可用。

管理員可以使用以下兩個sysctl參數,阻止實時調度策略下運行的程序占用所有CPU時間:

  • kernel.sched_rt_runtime_us,在kernel.sched_rt_period_us內實時態進程可使用的共享CPU時間,默認值950000,也就是0.95秒。設置為0,實時調度進程將無法獲取CPU時間。

  • kernel.sched_rt_period_us,CPU分配的周期時間,單位us,默認值1000000,也就是1秒。

    從kernel.sched_rt_period_us 中減去 kernel.sched_rt_runtime_us 后的剩余時間交給非實時調度器SCHED_NORMAL調度。

  • kernel.sched_rr_timeslice_ms,在SCHED_RR調度下的進程每次輪詢獲取的CPU時間,單位ms,默認值100,也就是0.1秒,有效范圍1-100。

非實時調度器

非實時調度器支持的調度策略:

  • SCHED_NORMAL,標準的輪詢方式時間共享調度,也稱為SCHED_OTHER
  • SCHED_BATCH,針對批量方式執行的進程策略。不像 SCHED_NORMAL 頻繁競爭,任務可以長時間運行。
  • SCHED_IDLE,用于執行非常低的優先級應用。使用 SCHED_IDLE 調度策略運行的進程比nice 19運行的進程優先級還低。

管理進程優先級-非實時調度策略

nice 值

常規系統上運行的大多數進程都使用 SCHED_OTHER 調度策略。由于并非所有進程都同等重要,因此可以為使用SCHED_OTHER調度策略運行的程序指定相對優先級,稱為nice值。

有40種不同級別的nice值,范圍 -20(最高優先級)到 19(最低優先級):

  • nice 值越高,代表優先級越低,獲取CPU能力越弱。
  • nice 值越低,代表優先級越高,獲取CPU能力越強。

注意: 當不存在CPU資源競爭時,即使nice值高的進程也可以獲得足夠CPU資源。

nice 值查看

top 命令

在這里插入圖片描述

ps命令

[li@server ~ 19:10:58]$ ps -o nice,cmd $(pgrep systemd)NI CMD0 /usr/lib/systemd/systemd --switched-root --system --deserialize 220 /usr/lib/systemd/systemd-journald0 /usr/lib/systemd/systemd-udevd0 /usr/lib/systemd/systemd-logind

默認情況下,子進程將繼承父進程的nice值,通常為0。

[li@server ~ 19:23:39]$ md5sum /dev/zero &
[1] 68517
[li@server ~ 19:24:18]$ ps -o pid,nice,command $$ 68517PID  NI COMMAND60940   0 -bash68517   0 md5sum /dev/zero# $$ 代表當前終端中運行的 shell 程序 PID

實時調度器進程優先級和非實時調度器進程優先級對比如下:

在這里插入圖片描述

結論: 優先級最低的實時調度器進程的優先級高于優先級最高的非實時調度器進程的優先級。

nice 命令
[li@server ~ 19:24:34]$ nice --help
用法:nice [選項] [命令 [參數]...]
Run COMMAND with an adjusted niceness, which affects process scheduling.
With no COMMAND, print the current niceness.  Niceness values range from
-20 (most favorable to the process) to 19 (least favorable to the process).Mandatory arguments to long options are mandatory for short options too.-n, --adjustment=N   add integer N to the niceness (default 10)--help		顯示此幫助信息并退出--version		顯示版本信息并退出

示例:

# nice值默認是10
[li@server ~ 19:25:59]$ nice md5sum /dev/zero &
[2] 68730[li@server ~ 19:27:59]$ ps -o pid,nice,commandPID  NI COMMAND60940   0 -bash68517   0 md5sum /dev/zero68730  10 md5sum /dev/zero68736   0 ps -o pid,nice,command

普通用戶僅允許使用正數的nice值運行程序。

# 設置一個負數優先級
[li@server ~ 19:28:05]$ nice -n -2 md5sum /dev/zero &
[3] 68797
[li@server ~ 19:29:09]$ nice: 無法設置優先級: 權限不夠
^C
[li@server ~ 19:29:25]$ ps -o pid,nice,command 68797PID  NI COMMAND68797   0 md5sum /dev/zero# 設置一個正數優先級
[li@server ~ 19:29:35]$ nice -n 2 md5sum /dev/zero &
[4] 68869
[li@server ~ 19:30:02]$ ps -o pid,nice,command 68869PID  NI COMMAND68869   2 md5sum /dev/zero
renice 命令
[li@server ~ 19:30:19]$ renice --help用法:renice [-n] <優先級> [-p|--pid] <pid>...renice [-n] <優先級>  -g|--pgrp <pgid>...renice [-n] <優先級>  -u|--user <用戶>...選項:-g, --pgrp <id>        將參數解釋為進程組 ID-n, --priority <數字>  指定 nice 增加值-p, --pid <id>         將參數解釋為進程 ID (默認)-u, --user <name|id>   將參數解釋為用戶名或用戶 ID-h, --help             顯示幫助文本并退出-V, --version          顯示版本信息并退出

修改上面示例中產生的進程的優先級。

[li@server ~ 19:30:53]$ renice -n 2 68797
68797 (進程 ID) 舊優先級為 0,新優先級為 2
[li@server ~ 19:31:55]$ ps -o pid,nice,command 68797PID  NI COMMAND68797   2 md5sum /dev/zero# 使用root用戶調整
[root@server ~ 19:12:42]# renice -n -2 68797
68797 (進程 ID) 舊優先級為 2,新優先級為 -2
[root@server ~ 19:32:57]# renice -n -2 68869
68869 (進程 ID) 舊優先級為 2,新優先級為 -2
[root@server ~ 19:33:30]# ps -o pid,nice,command 68797 68869PID  NI COMMAND68797  -2 md5sum /dev/zero68869  -2 md5sum /dev/zero
top 命令

top 界面查看進程CPU使用率:68797和68869,CPU使用率非常接近,因為優先級一致。

在這里插入圖片描述

在該界面中使用 r 指令設置進程nice值。

終止之前創建的4個md5sum進程。

[li@server ~ 19:32:25]$ pkill md5sum
[1]   已終止               md5sum /dev/zero
[2]   已終止               nice md5sum /dev/zero
[4]+  已終止               nice -n 2 md5sum /dev/zero
[3]+  已終止               nice -n -2 md5sum /dev/zero

管理進程優先級-實時調度策略

chrt 命令用于獲取和設置實時調度器進程優先級,以及更改進程調度器。

[root@server ~ 19:35:46]# chrt --help
Show or change the real-time scheduling attributes of a process.Set policy:chrt [options] <priority> <command> [<arg>...]chrt [options] --pid <priority> <pid>Get policy:chrt [options] -p <pid>Policy options:-b, --batch          set policy to SCHED_BATCH-d, --deadline       set policy to SCHED_DEADLINE-f, --fifo           set policy to SCHED_FIFO-i, --idle           set policy to SCHED_IDLE-o, --other          set policy to SCHED_OTHER-r, --rr             set policy to SCHED_RR (default)Scheduling options:-R, --reset-on-fork       set SCHED_RESET_ON_FORK for FIFO or RR-T, --sched-runtime <ns>  runtime parameter for DEADLINE-P, --sched-period <ns>   period parameter for DEADLINE-D, --sched-deadline <ns> deadline parameter for DEADLINEOther options:-a, --all-tasks      operate on all the tasks (threads) for a given pid-m, --max            show min and max valid priorities-p, --pid            operate on existing given pid-v, --verbose        display status information-h, --help     顯示此幫助并退出-V, --version  輸出版本信息并退出更多信息請參閱 chrt(1)

示例:

# 查看進程優先級范圍,chrt不能用于調整非實時進程nice值優先級。
[root@server ~ 19:37:16]# chrt -m
SCHED_OTHER min/max priority	: 0/0
SCHED_FIFO min/max priority	: 1/99
SCHED_RR min/max priority	: 1/99
SCHED_BATCH min/max priority	: 0/0
SCHED_IDLE min/max priority	: 0/0
SCHED_DEADLINE min/max priority	: 0/0# 以SCHED_RR調度器和優先級為5運行md5sum進程
[root@server ~ 19:38:40]# chrt -r 5 md5sum /dev/zero &
[2] 69391
[root@server ~ 19:39:03]# ps -o pid,cls,rtprio,command 69391PID CLS RTPRIO COMMAND69391  RR      5 md5sum /dev/zero# 修改進程調度器和優先級
[root@server ~ 19:39:17]# chrt -f --pid 10 69391
[root@server ~ 19:39:55]# ps -o pid,cls,rtprio,command 69391PID CLS RTPRIO COMMAND69391  FF     10 md5sum /dev/zero# 修改進程調度器為非實時
[root@server ~ 19:40:05]# chrt -o --pid 0 69391
[root@server ~ 19:40:33]# ps -o pid,cls,rtprio,command 69391PID CLS RTPRIO COMMAND69391  TS      - md5sum /dev/zero

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91438.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91438.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91438.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習篇---層與層之間搭配

在深度學習中&#xff0c;各種層&#xff08;比如卷積層、激活函數、池化層等&#xff09;的搭配不是隨意的&#xff0c;而是像 “搭積木” 一樣有規律 —— 每一層的作用互補&#xff0c;組合起來能高效提取特征、穩定訓練&#xff0c;最終提升模型性能。下面用通俗易懂的方式…

服務器多線主要是指什么?

在數字化的網絡環境當中&#xff0c;服務器已經成為各個企業提升線上業務發展的重要網絡設備&#xff0c;其中服務器多線則是指一臺服務器中能夠同時接入多個網絡運營商&#xff0c;并且通過智能路由技術實現用戶訪問請求的自動化分配&#xff0c;大大提高了用戶訪問數據信息的…

從0到1學PHP(三):PHP 流程控制:掌控程序的走向

目錄一、條件語句&#xff1a;程序的 “抉擇路口”1.1 if 語句家族&#xff1a;基礎與進階1.2 switch 語句&#xff1a;精準匹配的 “導航儀”二、循環語句&#xff1a;程序的 “重復舞步”2.1 for 循環&#xff1a;有序的 “征程”2.2 while 與 do - while 循環&#xff1a;條…

uni-app框架基礎

闡述 MVC 模式1, MVC與MVVMMVC 他是后端的一個開發思想MVVM是基于MVC中的view這層所分離出來的一種設計模式。MVC架構詳解MVC&#xff08;Model-View-Controller&#xff09;是一種廣泛使用的軟件設計模式&#xff0c;主要用于分離應用程序的業務邏輯、用戶界面和輸入控制。這種…

智慧收銀系統開發進銷存庫存統計,便利店、水果店、建材與家居行業的庫存匯總管理—仙盟創夢IDE

在零售與批發行業的數字化轉型中&#xff0c;當前庫存匯總作為進銷存管理的核心環節&#xff0c;直接影響著企業的資金周轉、銷售決策和客戶滿意度。現代收銀系統已超越傳統的收款功能&#xff0c;成為整合多渠道數據、實現實時庫存匯總的中樞神經。本文將深入剖析便利店、水果…

selenium(WEB自動化工具)

定義解釋 Selenium是一個用于Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中&#xff0c;就像真正的用戶在操作一樣。支持的瀏覽器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google Chrome&#xff0…

windows本地使用conda部署Open-webui

前提條件 Open-webui使用python3.11.9 步驟 conda操作也可以參考 安裝python torch、transformer、記錄 1、conda環境 # 創建環境 conda create --name openwebui python3.11.9# 激活環境 conda activate openwebui# 升級pip版本 pip install --upgrade pip# pip安裝openwe…

【Unity筆記04】數據持久化

&#x1f31f; 方案核心思想遵循以下設計原則&#xff1a;數據安全第一&#xff1a;絕不使用明文存儲&#xff0c;采用AES加密算法保護數據。性能優化&#xff1a;使用異步I/O操作&#xff0c;避免阻塞主線程導致游戲卡頓。結構清晰&#xff1a;模塊化設計&#xff0c;職責分離…

深入理解 HTML5 Web Workers:提升網頁性能的關鍵技術解析

深入理解 HTML5 Web Workers&#xff1a;提升網頁性能的關鍵技術解析引言1. 什么是 Web Workers&#xff1f;Web Workers 的特點&#xff1a;2. Web Workers 的使用方式2.1 創建一個 Web Worker步驟 1&#xff1a;創建 Worker 文件步驟 2&#xff1a;在主線程中調用 Worker3. W…

會議室預定系統核心技術:如何用一行SQL解決時間沖突檢測難題

文章目錄 一、為什么時間沖突檢測是預定系統的核心挑戰? 二、黃金法則:兩行線段重疊檢測法 三、四大沖突場景實戰解析(同一會議室) 四、生產環境完整解決方案 1. 基礎沖突檢測函數 2. 預定API處理流程 3. 高級邊界處理技巧 五、性能優化關鍵策略 六、不同數據庫的適配方案 …

13.正則表達式:文本處理的瑞士軍刀

正則表達式&#xff1a;文本處理的瑞士軍刀 &#x1f3af; 前言&#xff1a;當文本遇上神奇的密碼 想象一下&#xff0c;你是一個圖書管理員&#xff0c;面對著一堆亂七八糟的書籍信息&#xff1a; “聯系電話&#xff1a;138-1234-5678”“郵箱地址&#xff1a;zhang.sangm…

linux下c語言訪問mysql數據庫

一、連接數據庫基礎1. 頭文件與庫文件連接 MySQL 需包含的頭文件&#xff1a;#include <mysql/mysql.h> // 部分環境也可用 #include <mysql.h> 編譯鏈接時&#xff0c;Linux 平臺需指定庫名&#xff1a;-lmysqlclient &#xff0c;用于鏈接 MySQL 客戶端函數庫。2…

6. 傳輸層協議 UDP

傳輸層負責數據能夠從發送端傳輸接收端.1. 再談端口號端口號(Port)標識了一個主機上進行通信的不同的應用程序在 TCP/IP 協議中, 用 "源 IP", "源端口號", "目的 IP", "目的端口號", "協議號" 這樣一個五元組來標識一個通信…

vue 開發總結:從安裝到第一個交互頁面-與數據庫API

vue 總結 1、安裝vue&#xff1a; WinR 輸入&#xff1a;cnpm install -g vue/cli 驗證是否安裝成功&#xff1a;vue --version 2、新建Vue工程 在對應文件夾下右擊打開集成終端 輸入 vue create query_system&#xff08;新建項目名字&#xff09;名稱不能存在大寫&#x…

運維筆記:HTTP 性能優化

一、HTTP 協議特性與性能瓶頸1.1 HTTP 協議發展歷程HTTP 協議的演進直接影響著 Web 性能&#xff0c;各版本關鍵特性對比&#xff1a;協議版本發布時間核心特性性能優勢局限性HTTP/1.01996 年無狀態、短連接簡單易實現每次請求需建立 TCP 連接HTTP/1.11999 年長連接、管道化減少…

ubuntu:運行gcfsd-admin守護進程需要認證,解決方法

這里有個鎖子&#xff0c;每次進入都要輸入密碼&#xff0c;怎么解決&#xff1f; 重新掛載 /data 磁盤 sudo umount /data sudo ntfsfix /dev/sda1 sudo mount -o rw /dev/sda1 /data

1.DRF 環境安裝與配置

文章目錄一. Django Rest_Framework二、環境安裝與配置2.1 安裝 DRF2.2 創建Django項目2.3 添加 rest_framework 應用三、啟動項目一. Django Rest_Framework 核心思想&#xff1a;大量縮減編寫 api 接口的代碼 Django REST framework 是一個建立在 Django 基礎之上的 Web 應…

設計模式(十九)行為型:備忘錄模式詳解

設計模式&#xff08;十九&#xff09;行為型&#xff1a;備忘錄模式詳解備忘錄模式&#xff08;Memento Pattern&#xff09;是 GoF 23 種設計模式中的行為型模式之一&#xff0c;其核心價值在于在不破壞封裝性的前提下&#xff0c;捕獲并外部化一個對象的內部狀態&#xff0c…

Qt/C++開發監控GB28181系統/錄像回放/切換播放進度立即跳轉/支持8倍速播放/倍速和跳轉進度無縫切換

一、前言說明 在國標監控系統中&#xff0c;錄像回放過程中&#xff0c;需要切換播放進度&#xff0c;對比過很過國標系統&#xff0c;絕大部分尤其是網頁版的監控系統&#xff0c;在切換進度過程中都會黑屏&#xff0c;這個體驗就很不友好了&#xff0c;明明gb28181協議中就有…

【11】大恒相機SDK C++開發 ——原圖像數據IFrameData內存中上下顛倒,怎么裁剪ROI 實時顯示在pictureBox中

文章目錄3 當內存中的 圖像數據是垂直翻轉的時候怎么截取ROI 并顯示3.1 對ROI在原圖中的位置做轉換3.2 將ROI的最后一行當做開始位置&#xff0c;從底部向上復制數據3.3 完整代碼3.4 圖像數據在內存中上下顛倒的情況3.5 調用驗證4 unsafe代碼 解釋及注意事項 看我另一篇文章5 C…