日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
深入探究Linux阻塞隊(duì)列:解密高效的數(shù)據(jù)緩存機(jī)制 (linux 阻塞隊(duì)列)

Linux操作系統(tǒng)中的阻塞隊(duì)列是一種高效的數(shù)據(jù)緩存機(jī)制,它被廣泛應(yīng)用于各種設(shè)備驅(qū)動(dòng)程序和網(wǎng)絡(luò)協(xié)議棧的實(shí)現(xiàn)中,為Linux系統(tǒng)的性能提升做出了重要貢獻(xiàn)。本文將深入探究Linux阻塞隊(duì)列的原理、數(shù)據(jù)結(jié)構(gòu)和應(yīng)用,解密其高效的數(shù)據(jù)緩存機(jī)制,為Linux操作系統(tǒng)的開發(fā)者提供有價(jià)值的參考和啟示。

成都創(chuàng)新互聯(lián)主要從事網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)大興安嶺,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

1.阻塞隊(duì)列的原理

阻塞隊(duì)列(Blocking Queue)是在進(jìn)行隊(duì)列操作時(shí),當(dāng)隊(duì)列為空或滿時(shí),隊(duì)列插入和刪除操作被阻塞的一種隊(duì)列。在Linux系統(tǒng)中,阻塞隊(duì)列被廣泛應(yīng)用于各種設(shè)備驅(qū)動(dòng)程序和網(wǎng)絡(luò)協(xié)議棧的實(shí)現(xiàn)中,它可以保證數(shù)據(jù)的順序和準(zhǔn)確性,并可以防止競態(tài)條件(Race Condition)的出現(xiàn),從而大大提高了系統(tǒng)的性能。

阻塞隊(duì)列的特點(diǎn)在于,當(dāng)隊(duì)列為空時(shí),插入操作會(huì)被阻塞;當(dāng)隊(duì)列已滿時(shí),刪除操作會(huì)被阻塞。這樣一來,隊(duì)列的插入和刪除操作就可以相互協(xié)調(diào),避免了一些錯(cuò)誤的操作,從而提高了系統(tǒng)的效率。

2.阻塞隊(duì)列的數(shù)據(jù)結(jié)構(gòu)

Linux系統(tǒng)中的阻塞隊(duì)列通常使用兩個(gè)指針來實(shí)現(xiàn),一個(gè)指向隊(duì)列頭部,另一個(gè)指向隊(duì)列尾部。隊(duì)列的操作可以分為入隊(duì)和出隊(duì)兩種,當(dāng)對隊(duì)列進(jìn)行入隊(duì)操作時(shí),首先要判斷隊(duì)列是否已滿,如果隊(duì)列已滿,則當(dāng)前線程會(huì)被阻塞,等待其他線程或進(jìn)程從隊(duì)列中取走數(shù)據(jù)。當(dāng)對隊(duì)列進(jìn)行出隊(duì)操作時(shí),首先要判斷隊(duì)列是否為空,如果隊(duì)列為空,則當(dāng)前線程會(huì)被阻塞,等待其他線程或進(jìn)程插入數(shù)據(jù)到隊(duì)列中。

3.阻塞隊(duì)列的應(yīng)用

Linux系統(tǒng)中的阻塞隊(duì)列被廣泛應(yīng)用于各種設(shè)備驅(qū)動(dòng)程序和網(wǎng)絡(luò)協(xié)議棧的實(shí)現(xiàn)中,例如,網(wǎng)絡(luò)協(xié)議棧中的套接字緩沖區(qū)、網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序中的通用緩存機(jī)制等。阻塞隊(duì)列具有以下優(yōu)點(diǎn):

(1)提高系統(tǒng)的可靠性和安全性

使用阻塞隊(duì)列可以避免競態(tài)條件的出現(xiàn),保證數(shù)據(jù)的順序和準(zhǔn)確性,并提高系統(tǒng)的可靠性和安全性。

(2)減少CPU資源的消耗

使用阻塞隊(duì)列可以減少CPU的頻繁調(diào)度和上下文切換開銷,從而降低CPU資源的消耗。

(3)提高系統(tǒng)的性能和效率

使用阻塞隊(duì)列可以提高系統(tǒng)的性能和效率,避免了無效的等待和競爭,從而提高了系統(tǒng)的吞吐量和響應(yīng)速度。

4.

隨著計(jì)算機(jī)技術(shù)的不斷發(fā)展,Linux操作系統(tǒng)已經(jīng)成為了開源軟件的代表,其阻塞隊(duì)列也成為了廣泛應(yīng)用于各種領(lǐng)域的高效數(shù)據(jù)緩存機(jī)制。通過深入探究Linux阻塞隊(duì)列的原理、數(shù)據(jù)結(jié)構(gòu)和應(yīng)用,可以更好地理解其高效的數(shù)據(jù)緩存機(jī)制,為Linux操作系統(tǒng)的開發(fā)者提供有價(jià)值的參考和啟示。希望本文能夠?qū)V大讀者產(chǎn)生一定的啟發(fā)和幫助,更好地理解和掌握阻塞隊(duì)列的原理和應(yīng)用。

相關(guān)問題拓展閱讀:

  • 容器實(shí)戰(zhàn)

容器實(shí)戰(zhàn)

Namespace幫助容器來實(shí)現(xiàn)各種計(jì)算資源的隔離,Cgroups主要限制的是容器能夠使用的某種資源量。

init進(jìn)程創(chuàng)建的過程:

打開電源–> 執(zhí)行BIOS/boot-loader—>boot-loader加載Linux內(nèi)核(內(nèi)核文件存放在/boot目錄,文件名類似vmliunz*)–> 執(zhí)行的之一個(gè)用戶態(tài)程序就是init進(jìn)程。

1號(hào)進(jìn)程就是之一個(gè)用戶態(tài)的進(jìn)程,有它直接或者間接創(chuàng)建了namespace中的其他進(jìn)程。

特權(quán)信號(hào)就是Linux為kernel和超級用戶去刪除任意進(jìn)程所保留的,不能被忽略也不能被捕獲。

由于SIGKILL是一個(gè)特例,因?yàn)镾IGKILL是不允許注冊用戶handler的,那么它只有SIG_DFL handler,init進(jìn)程是永遠(yuǎn)不能被SIGKILL所殺,但是可以被SIGTERM殺死。

進(jìn)程處理信號(hào)的選擇:

1.Linux內(nèi)核里其實(shí)都是用task_struct這個(gè)接口來表示的。Linux里基本的調(diào)度單位是任務(wù)。任務(wù)的狀態(tài)有兩個(gè)TASK_RUNNING(運(yùn)行態(tài))和睡眠態(tài)(TASK_INTERRUPTIBLE,TASK_UNINTERRUPTIBLE).

運(yùn)行態(tài)是無論進(jìn)程是正在運(yùn)行中,還是進(jìn)程在run queue隊(duì)列里隨時(shí)可以運(yùn)行,都處于這個(gè)狀態(tài)。

睡眠是指進(jìn)程需要等待某個(gè)資源而進(jìn)入的狀態(tài),要等待的資源可以是一個(gè)信號(hào)量,或者是磁盤IO,這個(gè)狀態(tài)的進(jìn)程會(huì)被放入到wait queue隊(duì)列里。

TASK_INTERRUPTIBLE是可以被打斷的,顯示為S stat,TASK_UNINTERRUPTIBLE 是不能被打斷的,顯示的進(jìn)程為D stat。

在調(diào)用do_exit()的時(shí)候,有兩個(gè)狀態(tài),EXIT_DEAD,就是進(jìn)程在真正結(jié)束退出的宴漏好那一瞬間的狀態(tài);EXIT_ZOMBIE狀態(tài),是在EXIT_DEAD之前的一個(gè)狀態(tài)。

可以晌鉛通過/proc/sys/kernel/pid_max設(shè)置進(jìn)程更大的數(shù)量。如果機(jī)器中CPU數(shù)目小于等于32,pid_max設(shè)置為32768(32K),如果CPU數(shù)目大于32,pid_max的數(shù)目為N*1024.

在創(chuàng)建容器成功之后, 創(chuàng)建容器的服務(wù)會(huì)在/sys/fs/cgroups/pids下建立一個(gè)字目錄,就是一個(gè)控制組,控制組里最關(guān)鍵的一個(gè)文件是pids.max。

父進(jìn)程在創(chuàng)建完子進(jìn)程就不管了,這就是子進(jìn)程變成僵尸進(jìn)程的原因。

在主進(jìn)程里,就是不斷在調(diào)用帶WHOHANG參數(shù)的waitpid(),通過這個(gè)方式清理容器中所有的僵尸進(jìn)程。

Containerd在停止容器的時(shí)候,就會(huì)向容器的init進(jìn)程發(fā)送一個(gè)SIGTERM信號(hào),其他進(jìn)程收到的是SIGKILL信號(hào)。

kill()這個(gè)系統(tǒng)調(diào)用,輸入兩個(gè)參數(shù):進(jìn)程號(hào)和信號(hào),就把特定的信號(hào)發(fā)送給搜滲指定的進(jìn)程了。

signal調(diào)用,決定了進(jìn)程收到特定的信號(hào)如何來處理,SIG_DFL參數(shù)把對應(yīng)信號(hào)恢復(fù)為缺省handler, 也可以用自定義的函數(shù)作為handler,或者用SIG_IGN參數(shù)讓進(jìn)程忽略信號(hào)。

如何解決停止容器的時(shí)候,容器內(nèi)應(yīng)用程序被強(qiáng)制殺死的問題:

在容器的init進(jìn)程中對收到的信號(hào)做轉(zhuǎn)發(fā),發(fā)送到容器中的其他子進(jìn)程,這樣容器中的所有進(jìn)程在停止時(shí),都會(huì)收到SIGTERM,而不是SIGKILL信號(hào)了。

在/sys/fs/cgroup/cpu這個(gè)目錄看到cpu的數(shù)據(jù)

Linux普通的調(diào)度的算法是CFS(完全公平調(diào)度器)

cpu.cfs_period_us,cfs算法的一個(gè)調(diào)度周期,是以位秒為單位。

cpu.cfs_quota_us,在一個(gè)調(diào)度周期里這個(gè)控制組被允許的運(yùn)行時(shí)間。

cpu.shares,cpu cgroup對于控制組之間的cpu分配比例,缺省值為1024.

由于/proc/stat文件是整個(gè)節(jié)點(diǎn)全局的狀態(tài)文件,不屬于任何一個(gè)Namespace,因此在容器中無法通過讀取/proc/stat文件來獲取單個(gè)容器的CPU使用率。

單個(gè)容器CPU使用率=((utime_2 – utime_1)+(stime_2 – stime_1)) 100.0/(HZ et*1)

無法通過CPU Cgroup來控制Load Average的平均負(fù)載。

Load Average是一種CPU資源需求的度量:

平均負(fù)載統(tǒng)計(jì)了這兩種情況的進(jìn)程:

Load Average = 可運(yùn)行隊(duì)列進(jìn)程平均數(shù) + 休眠隊(duì)列中不可打斷的進(jìn)程平均數(shù)

OOM Killer是在Linux系統(tǒng)里如果內(nèi)存不足時(shí),就需要?dú)⑺酪粋€(gè)正在有耐性的進(jìn)程來釋放一些內(nèi)存。

Linux允許進(jìn)程在申請內(nèi)存的時(shí)候是overcommit,就是允許進(jìn)程申請超過實(shí)際物理內(nèi)存上線的內(nèi)存。

malloc()申請的是內(nèi)存虛擬地址,系統(tǒng)只是程序一個(gè)地址范圍,由于沒有寫入數(shù)據(jù),所以程序沒有得到真正的物理內(nèi)存。

oom_badness()函數(shù),判斷條件:

1.進(jìn)程已經(jīng)使用的物理內(nèi)存頁面數(shù);

2.每個(gè)進(jìn)程的OOM校準(zhǔn)值oom_scire_adj。在/proc文件系統(tǒng)中,每個(gè)進(jìn)程都有一個(gè)/proc//oom_score_adj的接口文件。

用系統(tǒng)總的可用頁面數(shù),乘以O(shè)OM校準(zhǔn)值oom_score_adj,再加上進(jìn)程已經(jīng)使用的物理頁面數(shù), 計(jì)算出來的值越大,那么這個(gè)進(jìn)程被OOM Killer的幾率也越大。

Memory Cgroup是對一組進(jìn)程的Memory做限制,掛在/sys/fs/cgroup/memory目錄下。

journalctl -k查看/var/log/message,看到的信息如下:

1.容器中每一個(gè)進(jìn)程使用的內(nèi)存頁面數(shù)量。

2.oom-kill: 可以看到那個(gè)容器發(fā)生

3.Killed process7445 那個(gè)進(jìn)程被殺死。

Linux內(nèi)存模型:RSS和Page Cache。

RSS:進(jìn)程真正申請到物理頁面的內(nèi)存大小。

判斷容器實(shí)際使用的內(nèi)存量需要使用memory.stat里的rss值。free獲取到的內(nèi)存值,需要去掉available字段下的值。

Page Cache是進(jìn)程在運(yùn)行中讀寫磁盤文件后,作為Cache而繼續(xù)保留在內(nèi)存中,它的目的是為了提高磁盤文件的讀寫性能。

內(nèi)存使用量計(jì)算公式(memory.kmem.usage_in_bytes表示該memcg內(nèi)核內(nèi)存使用量):memory.usage_in_bytes=memory.stat+memory.stat+memory.kmem.usage_in_bytes.

Memory Cgroup OOM不是真正依據(jù)內(nèi)存使用量memory.usage_in_bytes,而是依據(jù)working set,working set的計(jì)算公式: working_set = memory.usage_in_bytes – total_inactive_file。

swappiness(/proc/sys/vm/swapiness)可以決定系統(tǒng)將會(huì)有多頻繁地使用交換分區(qū)。取值范圍為0-100,缺省值為60。

memory.swapiness(Cgroup中的參數(shù))可以控制這個(gè)Memory Cgroup控制組下面匿名內(nèi)存和page cache的回收。

當(dāng)memory.swapiness=0的時(shí)候,對匿名頁的回收是始終禁止的,也就是始終不會(huì)使用Swap空間。

為了有效地減少磁盤上冗余的鏡像數(shù)據(jù),同時(shí)減少冗余的鏡像數(shù)據(jù)在網(wǎng)絡(luò)上的傳輸,選擇一種針對容器的文件系統(tǒng)是很有必要的,這類的文件系統(tǒng)被稱為UnionFS。

UnionFS實(shí)現(xiàn)的主要功能是把多個(gè)目錄一起掛載在同一目錄下。

OverlayFS是Liunx發(fā)行版本里缺省使用的容器文件系統(tǒng)。

OverlayFS也是把多個(gè)目錄合并掛載,被掛載的目錄分為兩大類:lowerdir和upperdir。

lowerdir允許有多個(gè)目錄,在被掛載后,這些目錄里的文件都是不會(huì)被修改或者刪除,也就是只讀的;upper只有一個(gè),不過這個(gè)目錄是可讀寫的,掛載點(diǎn)目錄中的所有文件修改都會(huì)在upperdir中反映出來。

OverlayFS建立2個(gè)lowerdir目錄,并且在目錄中建立相同文件名的文件,然后一起做一個(gè)overlay mount,為將文件合并成為一個(gè)。

為了避免容器把宿主機(jī)的磁盤寫滿,對OverlayFS的upper目錄做XFS Quota的限流。

docker run –storage-opt size=10M,就能限制容器OverlayFS文件系統(tǒng)可寫入的更大數(shù)據(jù)量。

限制文件大小分為兩步:

之一步:給目標(biāo)目錄打上一個(gè)Project ID;

第二步:為這個(gè)Project ID在XFS文件系統(tǒng)中,設(shè)置一個(gè)寫入數(shù)據(jù)塊的限制。

setProjectID()是調(diào)用ioctl(),setProjectQuota()調(diào)用quotactl()來修改內(nèi)核中XFS的數(shù)據(jù)結(jié)構(gòu),從而完成project ID的設(shè)置和quota的設(shè)置。

如何判斷是對那個(gè)目錄做了限制:

根據(jù)/proc/mounts中容器的OverlayFS Mount信息,可以知道限制的目錄/var/lib/docker2/,目錄下的diff目錄就是限制目錄。

IOPS就是每秒鐘磁盤讀寫的次數(shù),這個(gè)數(shù)值越大,性能越好。

吞吐量是每秒鐘磁盤中數(shù)據(jù)的讀取量。

吞吐量 = 數(shù)據(jù)塊大小 * IOPS。

在Cgroup v1里,bulkio Cgroup的虛擬文件系統(tǒng)掛載點(diǎn)一半在/sys/fs/cgroup/blkio/。

Direct I/O模式,用戶進(jìn)程如果要寫磁盤文件,就會(huì)通過Linux內(nèi)核的文件系統(tǒng)層(fileSystem)–>塊設(shè)備層(block layer)–>磁盤驅(qū)動(dòng)–>磁盤硬件。

Buffer I/O模式,用戶進(jìn)程只是把文件寫到內(nèi)存中就返回,Linux內(nèi)核自己有線程會(huì)被內(nèi)存中的數(shù)據(jù)寫入到磁盤中Cgroup v1 blkio的子系統(tǒng)獨(dú)立于memory系統(tǒng),無法統(tǒng)計(jì)到有Page Cache刷入到磁盤的數(shù)據(jù)量。Linux中絕大多數(shù)使用的是Buffered I/O模式。

Direct I/O可以通過blkio Cgroup來限制磁盤I/O。Cgroup V2從架構(gòu)上允許一個(gè)控制組里只要同時(shí)有IO和Memory子系統(tǒng),就可以對Buffered I/O做磁盤讀寫的限速。

dirty_backgroud_ratio和dirty_ratio,這兩個(gè)值都是相對于節(jié)點(diǎn)可用內(nèi)存的百分比值。

當(dāng)dirty pages數(shù)量超過dirty_backgroud_ratio對應(yīng)的內(nèi)存量的時(shí)候,內(nèi)核flush線程就會(huì)開始把dirty page寫入磁盤;當(dāng)dirty pages數(shù)量超過dirty_ratio對應(yīng)的內(nèi)存量,這時(shí)候程序?qū)懳募暮瘮?shù)調(diào)用write()就會(huì)被阻塞住,知道這次調(diào)用的dirty pages全部寫入到磁盤。

在節(jié)點(diǎn)是大內(nèi)存容量,并且dirty_ratio為系統(tǒng)缺省值為20%,dirty_backgroud_ratio是系統(tǒng)缺省值10%的情況下,通過觀察/proc/vmstat中的nr_dirty數(shù)值可以發(fā)現(xiàn),dirty pages不會(huì)阻塞進(jìn)程的Buffered I/O寫文件操作。

修改網(wǎng)絡(luò)參數(shù)的有兩種方法:一種方法是直接到/proc文件系統(tǒng)下的/proc/sys/net目錄對參數(shù)做修改;還有就是使用sysctl來修改。

創(chuàng)建新的network namespace的方法:系統(tǒng)調(diào)用clone()或者unshare()。

Network Namespace工具包:

runC也在對/proc/sys目錄做read-only mount之前,預(yù)留出了修改接口,就是用來修改容器里/proc/sys下參數(shù)的,同樣也是sysctl的參數(shù)。

在容器啟動(dòng)之前修改網(wǎng)絡(luò)相關(guān)的內(nèi)容,是可以的,如果啟動(dòng)之后,修改網(wǎng)絡(luò)相關(guān)內(nèi)容的是不生效的。

docker exec、kubectl exec、ip netns exec、nsenter等命令原理相同,都是基于setns系統(tǒng)調(diào)用,切換至指定的一個(gè)或多個(gè)namespace。

解決容器與外界通訊的問題,一共需要兩步完成。

對于macvlan,每個(gè)虛擬網(wǎng)絡(luò)接口都有自己獨(dú)立的mac地址,而ipvlan的虛擬網(wǎng)絡(luò)接口是和物理網(wǎng)絡(luò)接口共享一個(gè)mac地址。

veth對外發(fā)送數(shù)據(jù)的時(shí)候,peer veth接口都會(huì)raise softirq來完成一次收報(bào)操作,這樣就會(huì)帶來數(shù)據(jù)包處理的額外開銷。

容器使用ipvlan/macvlan的網(wǎng)絡(luò)接口,網(wǎng)絡(luò)延時(shí)可以非常接近物理網(wǎng)絡(luò)接口的延時(shí)。

對于需要使用iptables規(guī)則的容器,Kubernetes使用service的容器,就不能工作:

docker inspect lat-test-1 | jq..state.Pid

Linux capabilities就是把Linux root用戶原來所有的特權(quán)做了細(xì)化,可以更加細(xì)粒度地給進(jìn)程賦予不同權(quán)限。

Privileged的容器也就是允許容器中的進(jìn)程可以執(zhí)行所有的特權(quán)操作。

容器中root用戶的進(jìn)程,系統(tǒng)也只允許了15個(gè)capabilities。

使用不同用戶執(zhí)行程序:

xfs quota功能

centos7 xfs 文件系統(tǒng)配置quota 用戶磁盤配額

quota磁盤配額(xfs)

xfs_quota 磁盤配額

xfs_quota 磁盤配額限制篇

XFS文件系統(tǒng)中quota的使用

xfs文件系統(tǒng)quota

Linux學(xué)習(xí)—CentOS7磁盤配額工具quota

linux 阻塞隊(duì)列的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux 阻塞隊(duì)列,深入探究Linux阻塞隊(duì)列:解密高效的數(shù)據(jù)緩存機(jī)制,容器實(shí)戰(zhàn)的信息別忘了在本站進(jìn)行查找喔。

成都網(wǎng)站推廣找創(chuàng)新互聯(lián),老牌網(wǎng)站營銷公司
成都網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)(www.cdcxhl.com)專注高端網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì)制作,網(wǎng)站維護(hù),網(wǎng)絡(luò)營銷,SEO優(yōu)化推廣,快速提升企業(yè)網(wǎng)站排名等一站式服務(wù)。IDC基礎(chǔ)服務(wù):云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)、服務(wù)器租用、服務(wù)器托管提供四川、成都、綿陽、雅安、重慶、貴州、昆明、鄭州、湖北十堰機(jī)房互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)。


分享文章:深入探究Linux阻塞隊(duì)列:解密高效的數(shù)據(jù)緩存機(jī)制 (linux 阻塞隊(duì)列)
網(wǎng)址分享:http://www.5511xx.com/article/ccojepd.html