日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Linux 多線程隊(duì)列:高效處理任務(wù)的利器 (linux 多線程隊(duì)列)

隨著互聯(lián)網(wǎng)的快速發(fā)展,計(jì)算機(jī)處理大規(guī)模數(shù)據(jù)的能力也變得越來(lái)越重要。在處理大量數(shù)據(jù)的同時(shí),確保計(jì)算機(jī)的處理效率和穩(wěn)定性也同樣重要。

linux 多線程隊(duì)列是一種高效處理任務(wù)的利器,它可以幫助計(jì)算機(jī)并行處理多個(gè)任務(wù),從而提高計(jì)算機(jī)的處理效率。同時(shí),Linux 多線程隊(duì)列還可以幫助處理大規(guī)模數(shù)據(jù)時(shí)降低 CPU 的占用率,避免系統(tǒng)負(fù)載過(guò)高而導(dǎo)致的系統(tǒng)崩潰。

本文將介紹 Linux 多線程隊(duì)列的相關(guān)知識(shí),包括多線程隊(duì)列的基本概念、多線程隊(duì)列的使用場(chǎng)景、多線程隊(duì)列的優(yōu)缺點(diǎn)以及如何使用多線程隊(duì)列來(lái)提高計(jì)算機(jī)的處理效率等。

一、多線程隊(duì)列的基本概念

多線程隊(duì)列是一種同時(shí)具備線程和隊(duì)列的數(shù)據(jù)結(jié)構(gòu),它是一種并發(fā)編程的重要工具。在多線程隊(duì)列中,任務(wù)被分配到多個(gè)線程中執(zhí)行,每個(gè)線程會(huì)從隊(duì)列中獲取任務(wù)并執(zhí)行,直到隊(duì)列為空。

每個(gè)任務(wù)在隊(duì)列中都具有一個(gè)優(yōu)先級(jí),可以通過(guò)調(diào)整任務(wù)優(yōu)先級(jí)的方式來(lái)控制多線程隊(duì)列的工作流程。當(dāng)隊(duì)列中有多個(gè)任務(wù)被加入時(shí),多線程隊(duì)列會(huì)根據(jù)任務(wù)的優(yōu)先級(jí)來(lái)決定哪些任務(wù)先執(zhí)行,哪些任務(wù)后執(zhí)行。

二、多線程隊(duì)列的使用場(chǎng)景

多線程隊(duì)列可以廣泛應(yīng)用于各種需要高效處理任務(wù)的場(chǎng)景中,如網(wǎng)絡(luò)通信、多媒體處理、數(shù)據(jù)庫(kù)讀寫(xiě)以及科學(xué)計(jì)算等領(lǐng)域。以下是一些可以使用多線程隊(duì)列的場(chǎng)景示例:

1. 網(wǎng)絡(luò)通信:網(wǎng)絡(luò)通信是一個(gè)需要處理大量數(shù)據(jù)的場(chǎng)景,使用多線程隊(duì)列可以幫助實(shí)現(xiàn)高吞吐量和低延遲的通信。

2. 多媒體處理:多媒體處理需要同時(shí)處理多個(gè)數(shù)據(jù)流,使用多線程隊(duì)列可以幫助將多媒體處理任務(wù)分配到多個(gè)線程中執(zhí)行,從而提高處理效率。

3. 數(shù)據(jù)庫(kù)讀寫(xiě):數(shù)據(jù)庫(kù)讀寫(xiě)也是一個(gè)需要高效處理數(shù)據(jù)的場(chǎng)景,使用多線程隊(duì)列可以避免因占用過(guò)多數(shù)據(jù)庫(kù)連接而導(dǎo)致的問(wèn)題。

4. 科學(xué)計(jì)算:科學(xué)計(jì)算需要處理大量數(shù)據(jù)并實(shí)現(xiàn)高并發(fā)處理,使用多線程隊(duì)列可以幫助分配計(jì)算任務(wù)并提高計(jì)算效率。

三、多線程隊(duì)列的優(yōu)缺點(diǎn)

多線程隊(duì)列作為一種并發(fā)編程工具,其優(yōu)缺點(diǎn)并不可避免。以下是多線程隊(duì)列的優(yōu)缺點(diǎn):

1. 優(yōu)點(diǎn):

(1) 可以將任務(wù)分為多個(gè)線程同時(shí)執(zhí)行,從而提高任務(wù)的處理效率。

(2) 可以避免因占用過(guò)多 CPU 而導(dǎo)致的系統(tǒng)崩潰。

(3) 可以提供任務(wù)優(yōu)先級(jí)的調(diào)整,有利于控制任務(wù)處理的順序。

2. 缺點(diǎn):

(1) 多線程隊(duì)列的使用需要一定的并發(fā)編程技術(shù),對(duì)開(kāi)發(fā)人員要求較高。

(2) 多線程隊(duì)列的管理和優(yōu)化需要一定的成本和精力。

四、如何使用多線程隊(duì)列來(lái)提高計(jì)算機(jī)的處理效率

如何使用多線程隊(duì)列來(lái)提高計(jì)算機(jī)處理效率呢?以下是一些使用多線程隊(duì)列的實(shí)踐技巧:

1. 任務(wù)分配優(yōu)化:優(yōu)化任務(wù)分配可以有效提高多線程隊(duì)列的處理效率??梢酝ㄟ^(guò)控制隊(duì)列長(zhǎng)度、調(diào)整任務(wù)優(yōu)先級(jí)和降低隊(duì)列等待時(shí)間等方式來(lái)實(shí)現(xiàn)任務(wù)分配優(yōu)化。

2. 內(nèi)存管理優(yōu)化:內(nèi)存管理也是多線程隊(duì)列的一個(gè)關(guān)鍵點(diǎn),合理地分配內(nèi)存可以提高隊(duì)列的運(yùn)行效率。可以通過(guò)合理設(shè)置內(nèi)存分配策略以及減少內(nèi)存分配次數(shù)等方式來(lái)實(shí)現(xiàn)內(nèi)存管理的優(yōu)化。

3. 線程管理優(yōu)化:線程管理是多線程隊(duì)列運(yùn)行穩(wěn)定性的保障??梢酝ㄟ^(guò)設(shè)置線程池大小、限制線程占用資源的數(shù)量和調(diào)整線程優(yōu)先級(jí)等方式來(lái)實(shí)現(xiàn)線程管理優(yōu)化。

在計(jì)算機(jī)處理大規(guī)模數(shù)據(jù)時(shí),多線程隊(duì)列是一種高效處理任務(wù)的利器,可以有效地提高計(jì)算機(jī)的處理效率。通過(guò)合理設(shè)置任務(wù)分配、內(nèi)存管理和線程管理等因素,我們可以使多線程隊(duì)列的運(yùn)行更加穩(wěn)定和高效。因此,掌握多線程隊(duì)列技術(shù)是非常有必要的。

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

  • 在Linux 上,編寫(xiě)一個(gè)每秒接收 100萬(wàn)UDP數(shù)據(jù)包的程序究竟有多難
  • 純軟件開(kāi)發(fā)人員怎樣做嵌入式linux應(yīng)用開(kāi)發(fā)

在Linux 上,編寫(xiě)一個(gè)每秒接收 100萬(wàn)UDP數(shù)據(jù)包的程序究竟有多難

首先,我們假設(shè):

測(cè)神世量每秒的數(shù)據(jù)包(pps)比測(cè)量每秒字節(jié)數(shù)(Bps)更有意思。您可以通過(guò)更好的管道輸送以及發(fā)送更長(zhǎng)數(shù)據(jù)包來(lái)獲取更高的Bps。而相比之下,提高pps要困難得多。

因?yàn)槲覀儗?duì)pps感興趣,我們的實(shí)驗(yàn)將使用較短的 UDP 消息。準(zhǔn)確來(lái)說(shuō)是 32 字節(jié)的 UDP 負(fù)載,這相當(dāng)于以太網(wǎng)層的 74 字節(jié)。

在實(shí)驗(yàn)中,我們將使用兩個(gè)物理服務(wù)器:“接收器”和“發(fā)送器”。

它們都有兩個(gè)六核2 GHz的 Xeon處理器。每個(gè)服務(wù)器都啟用了 24 個(gè)處理器的超線程(HT),有 Solarflare 的 10G 多隊(duì)列網(wǎng)卡,有 11 個(gè)接收隊(duì)列配置。稍后將詳細(xì)介紹。

測(cè)試程序的源代碼分別是:udpsender、udpreceiver。

預(yù)備知識(shí)

我們使用4321作為UDP數(shù)據(jù)包的端口,在開(kāi)始之前,我們必須確保傳輸不會(huì)被iptables干擾:

Shell

receiver$ iptables -I INPUT 1 -p udp –dportj ACCEPT

receiver$ iptables -t raw -I PREROUTING 1 -p udp –dportj NOTRACK

為了后面測(cè)試方便,我們顯式地定義IP地址:

Shell

receiver$ for i in `seq 1 20`; do

ip addr add 192.168.254.$i/24 dev eth2;

done

sender$ ip addr add 192.168.254.30/24 dev eth3

1. 簡(jiǎn)單的方法

開(kāi)始我們做一些最簡(jiǎn)單的試驗(yàn)。通過(guò)簡(jiǎn)單地發(fā)送和接收,有多少包將會(huì)被傳送?

模擬發(fā)送者的偽代碼:

Python

fd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

fd.bind((“0.0.0.0”, 65400)) # select source port to reduce nondetermini

fd.connect((“192.168.254.1”, 4321))

while True:

fd.sendmmsg( * 1024)

因?yàn)槲覀兪褂昧顺R?jiàn)的系統(tǒng)調(diào)用的send,所以效率不會(huì)很高。上下文切換到內(nèi)核代價(jià)很高所以更好避免它。幸運(yùn)地是,最近Linux加入了一個(gè)方便的系統(tǒng)調(diào)用叫sendmmsg。它允許我們?cè)谝淮握{(diào)用時(shí),發(fā)送很多的數(shù)據(jù)包。那我們就一次發(fā)1024個(gè)數(shù)據(jù)包。

模擬接受者的偽代碼褲沖:

Python

fd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

fd.bind((“0.0.0.0”, 4321))

while True:

packets = * 1024

fd.recvmmsg(packets, MSG_WAITFORONE)

同樣地,recvmmsg 也是相對(duì)于常見(jiàn)的 recv 更有效的一版系統(tǒng)調(diào)用。

讓我們?cè)囋嚢桑?/p>

Shell

sender$ ./udpsender 192.168.254.1:4321

receiver$ ./udpreceiver1 0.0.0.0:4321

0.352M pps 10.730MiB / 90.010Mb

0.284M pps 8.655MiB / 72.603Mb

0.262M pps 7.991MiB / 67.033Mb

0.199M pps 6.081MiB / 51.013Mb

0.195M pps 5.956MiB / 49.966Mb

0.199M pps 6.060MiB / 50.836Mb

0.200M pps 6.097MiB / 51.147Mb

0.197M pps 6.021MiB / 50.509Mb

測(cè)試發(fā)現(xiàn),運(yùn)用最簡(jiǎn)單的方式可游純肢以實(shí)現(xiàn) 197k – 350k pps??雌饋?lái)還不錯(cuò)嘛,但不幸的是,很不穩(wěn)定啊,這是因?yàn)閮?nèi)核在核之間交換我們的程序,那我們把進(jìn)程附在 CPU 上將會(huì)有所幫助

Shell

sender$ taskset -c 1 ./udpsender 192.168.254.1:4321

receiver$ taskset -c 1 ./udpreceiver1 0.0.0.0:4321

0.362M pps 11.058MiB / 92.760Mb

0.374M pps 11.411MiB / 95.723Mb

0.369M pps 11.252MiB / 94.389Mb

0.370M pps 11.289MiB / 94.696Mb

0.365M pps 11.152MiB / 93.552Mb

0.360M pps 10.971MiB / 92.033Mb

現(xiàn)在內(nèi)核調(diào)度器將進(jìn)程運(yùn)行在特定的CPU上,這提高了處理器緩存,使數(shù)據(jù)更加一致,這就是我們想要的??!

2. 發(fā)送更多的數(shù)據(jù)包

雖然 370k pps 對(duì)于簡(jiǎn)單的程序來(lái)說(shuō)已經(jīng)很不錯(cuò)了,但是離我們 1Mpps 的目標(biāo)還有些距離。為了接收更多,首先我們必須發(fā)送更多的包。那我們用獨(dú)立的兩個(gè)線程發(fā)送,如何呢:

Shell

sender$ taskset -c 1,2 ./udpsender

2.168.254.1:.168.254.1:4321

receiver$ taskset -c 1 ./udpreceiver1 0.0.0.0:4321

0.349M pps 10.651MiB / 89.343Mb

0.354M pps 10.815MiB / 90.724Mb

0.354M pps 10.806MiB / 90.646Mb

0.354M pps 10.811MiB / 90.690Mb

接收一端的數(shù)據(jù)沒(méi)有增加,ethtool –S 命令將顯示數(shù)據(jù)包實(shí)際上都去哪兒了:

Shell

receiver$ watch ‘sudo ethtool -S eth2 |grep rx’

rx_nodesc_drop_cnt:.3k/s

rx-0.rx_packets: 8.0/s

rx-1.rx_packets: 0.0/s

rx-2.rx_packets: 0.0/s

rx-3.rx_packets: 0.5/s

rx-4.rx_packets: 355.2k/s

rx-5.rx_packets: 0.0/s

rx-6.rx_packets: 0.0/s

rx-7.rx_packets: 0.5/s

rx-8.rx_packets: 0.0/s

rx-9.rx_packets: 0.0/s

rx-10.rx_packets: 0.0/s

通過(guò)這些統(tǒng)計(jì),NIC 顯示 4 號(hào) RX 隊(duì)列已經(jīng)成功地傳輸大約 350Kpps。rx_nodesc_drop_cnt 是 Solarflare 特有的計(jì)數(shù)器,表明NIC發(fā)送到內(nèi)核未能實(shí)現(xiàn)發(fā)送 450kpps。

有時(shí)候,這些數(shù)據(jù)包沒(méi)有被發(fā)送的原因不是很清晰,然而在我們這種情境下卻很清楚:4號(hào)RX隊(duì)列發(fā)送數(shù)據(jù)包到4號(hào)CPU,然而4號(hào)CPU已經(jīng)忙不過(guò)來(lái)了,因?yàn)樗蠲σ仓荒茏x350kpps。在htop中顯示為:

多隊(duì)列 NIC 速成課程

從歷史上看,網(wǎng)卡擁有單個(gè)RX隊(duì)列,用于硬件和內(nèi)核之間傳遞數(shù)據(jù)包。這樣的設(shè)計(jì)有一個(gè)明顯的限制,就是不可能比單個(gè)CPU處理更多的數(shù)據(jù)包。

為了利用多核系統(tǒng),NIC開(kāi)始支持多個(gè)RX隊(duì)列。這種設(shè)計(jì)很簡(jiǎn)單:每個(gè)RX隊(duì)列被附到分開(kāi)的CPU上,因此,把包送到所有的RX隊(duì)列網(wǎng)卡可以利用所有的CPU。但是又產(chǎn)生了另一個(gè)問(wèn)題:對(duì)于一個(gè)數(shù)據(jù)包,NIC怎么決定把它發(fā)送到哪一個(gè)RX隊(duì)列?

用 Round-robin 的方式來(lái)平衡是不能接受的,因?yàn)檫@有可能導(dǎo)致單個(gè)連接中數(shù)據(jù)包的重排序。另一種方法是使用數(shù)據(jù)包的hash值來(lái)決定RX號(hào)碼。Hash值通常由一個(gè)元組(源IP,目標(biāo)IP,源port,目標(biāo)port)計(jì)算而來(lái)。這確保了從一個(gè)流產(chǎn)生的包將最終在完全相同的RX隊(duì)列,并且不可能在一個(gè)流中重排包。

在我們的例子中,hash值可能是這樣的:

Shell

RX_queue_number = hash(‘192.168.254.30’, ‘192.168.254.1’, 65400, 4321) % number_of_queues

多隊(duì)列 hash 算法

Hash算法通過(guò)ethtool配置,設(shè)置如下:

Shell

receiver$ ethtool -n eth2 rx-flow-hash udp4

UDP over IPV4 flows use these fields for computing Hash flow key:

IP SA

IP DA

對(duì)于IPv4 UDP數(shù)據(jù)包,NIC將hash(源 IP,目標(biāo) IP)地址。即

Shell

RX_queue_number = hash(‘192.168.254.30’, ‘192.168.254.1’) % number_of_queues

這是相當(dāng)有限的,因?yàn)樗雎粤硕丝谔?hào)。很多NIC允許自定義hash。再一次,使用ethtool我們可以選擇元組(源 IP、目標(biāo) IP、源port、目標(biāo)port)生成hash值。

Shell

receiver$ ethtool -N eth2 rx-flow-hash udp4 sdfn

Cannot change RX network flow hashing options: Operation not supported

不幸地是,我們的NIC不支持自定義,我們只能選用(源 IP、目的 IP) 生成hash。

NUMA性能報(bào)告

到目前為止,我們所有的數(shù)據(jù)包都流向一個(gè)RX隊(duì)列,并且一個(gè)CPU。我們可以借這個(gè)機(jī)會(huì)為基準(zhǔn)來(lái)衡量不同CPU的性能。在我們?cè)O(shè)置為接收方的主機(jī)上有兩個(gè)單獨(dú)的處理器,每一個(gè)都是一個(gè)不同的NUMA節(jié)點(diǎn)。

在我們?cè)O(shè)置中,可以將單線程接收者依附到四個(gè)CPU中的一個(gè),四個(gè)選項(xiàng)如下:

另一個(gè)CPU上運(yùn)行接收器,但將相同的NUMA節(jié)點(diǎn)作為RX隊(duì)列。性能如上面我們看到的,大約是360 kpps。

將運(yùn)行接收器的同一 CPU 作為RX隊(duì)列,我們可以得到大約430 kpps。但這樣也會(huì)有很高的不穩(wěn)定性,如果NIC被數(shù)據(jù)包所淹沒(méi),性能將下降到零。

當(dāng)接收器運(yùn)行在HT對(duì)應(yīng)的處理RX隊(duì)列的CPU之上,性能是通常的一半,大約在200kpps左右。

接收器在一個(gè)不同的NUMA節(jié)點(diǎn)而不是RX隊(duì)列的CPU上,性能大約是330 kpps。但是數(shù)字會(huì)不太一致。

雖然運(yùn)行在一個(gè)不同的NUMA節(jié)點(diǎn)上有10%的代價(jià),聽(tīng)起來(lái)可能不算太壞,但隨著規(guī)模的變大,問(wèn)題只會(huì)變得更糟。在一些測(cè)試中,每個(gè)核只能發(fā)出250 kpps,在所有跨NUMA測(cè)試中,這種不穩(wěn)定是很糟糕??鏝UMA節(jié)點(diǎn)的性能損失,在更高的吞吐量上更明顯。在一次測(cè)試時(shí),發(fā)現(xiàn)在一個(gè)壞掉的NUMA節(jié)點(diǎn)上運(yùn)行接收器,性能下降有4倍。

3.多接收IP

因?yàn)槲覀僋IC上hash算法的限制,通過(guò)RX隊(duì)列分配數(shù)據(jù)包的唯一方法是利用多個(gè)IP地址。下面是如何將數(shù)據(jù)包發(fā)到不同的目的IP:

sender$ taskset -c 1,2 ./udpsender 192.168.254.1:.168.254.2:4321

ethtool 證實(shí)了數(shù)據(jù)包流向了不同的 RX 隊(duì)列:

Shell

receiver$ watch ‘sudo ethtool -S eth2 |grep rx’

rx-0.rx_packets: 8.0/s

rx-1.rx_packets: 0.0/s

rx-2.rx_packets: 0.0/s

rx-3.rx_packets: 355.2k/s

rx-4.rx_packets: 0.5/s

rx-5.rx_packets: 297.0k/s

rx-6.rx_packets: 0.0/s

rx-7.rx_packets: 0.5/s

rx-8.rx_packets: 0.0/s

rx-9.rx_packets: 0.0/s

rx-10.rx_packets: 0.0/s

接收部分:

Shell

receiver$ taskset -c 1 ./udpreceiver1 0.0.0.0:4321

0.609M pps 18.599MiB / 156.019Mb

0.657M pps 20.039MiB / 168.102Mb

0.649M pps 19.803MiB / 166.120Mb

萬(wàn)歲!有兩個(gè)核忙于處理RX隊(duì)列,第三運(yùn)行應(yīng)用程序時(shí),可以達(dá)到大約650 kpps !

我們可以通過(guò)發(fā)送數(shù)據(jù)到三或四個(gè)RX隊(duì)列來(lái)增加這個(gè)數(shù)值,但是很快這個(gè)應(yīng)用就會(huì)有另一個(gè)瓶頸。這一次rx_nodesc_drop_cnt沒(méi)有增加,但是netstat接收到了如下錯(cuò)誤:

Shell

receiver$ watch ‘netstat -s –udp’

Udp:

.0k/s packets received

.0/s packets to unknown port received.

.9k/s packet receive errors

.0/s packets sent

RcvbufErrors: 123.8k/s

SndbufErrors: 0

InCsumErrors: 0

這意味著雖然NIC能夠?qū)?shù)據(jù)包發(fā)送到內(nèi)核,但是內(nèi)核不能將數(shù)據(jù)包發(fā)給應(yīng)用程序。在我們的case中,只能提供440 kpps,其余的390 kpps + 123 kpps的下降是由于應(yīng)用程序接收它們不夠快。

4.多線程接收

我們需要擴(kuò)展接收者應(yīng)用程序。最簡(jiǎn)單的方式是利用多線程接收,但是不管用:

Shell

sender$ taskset -c 1,2 ./udpsender 192.168.254.1:.168.254.2:4321

receiver$ taskset -c 1,2 ./udpreceiver1 0.0.0.0:

0.495M pps 15.108MiB / 126.733Mb

0.480M pps 14.636MiB / 122.775Mb

0.461M pps 14.071MiB / 118.038Mb

0.486M pps 14.820MiB / 124.322Mb

接收性能較于單個(gè)線程下降了,這是由UDP接收緩沖區(qū)那邊的鎖競(jìng)爭(zhēng)導(dǎo)致的。由于兩個(gè)線程使用相同的套接字描述符,它們花費(fèi)過(guò)多的時(shí)間在UDP接收緩沖區(qū)的鎖競(jìng)爭(zhēng)。這篇論文詳細(xì)描述了這一問(wèn)題。

看來(lái)使用多線程從一個(gè)描述符接收,并不是更優(yōu)方案。

5. SO_REUSEPORT

幸運(yùn)地是,最近有一個(gè)解決方案添加到 Linux 了 —— SO_REUSEPORT 標(biāo)志位(flag)。當(dāng)這個(gè)標(biāo)志位設(shè)置在一個(gè)套接字描述符上時(shí),Linux將允許許多進(jìn)程綁定到相同的端口,事實(shí)上,任何數(shù)量的進(jìn)程將允許綁定上去,負(fù)載也會(huì)均衡分布。

有了SO_REUSEPORT,每一個(gè)進(jìn)程都有一個(gè)獨(dú)立的socket描述符。因此每一個(gè)都會(huì)擁有一個(gè)專(zhuān)用的UDP接收緩沖區(qū)。這樣就避免了以前遇到的競(jìng)爭(zhēng)問(wèn)題:

Shell

receiver$ taskset -c 1,2,3,4 ./udpreceiver1 0.0.0.0:

1.114M pps 34.007MiB / 285.271Mb

1.147M pps 34.990MiB / 293.518Mb

1.126M pps 34.374MiB / 288.354Mb

現(xiàn)在更加喜歡了,吞吐量很不錯(cuò)嘛!

更多的調(diào)查顯示還有進(jìn)一步改進(jìn)的空間。即使我們開(kāi)始4個(gè)接收線程,負(fù)載也會(huì)不均勻地分布:

兩個(gè)進(jìn)程接收了所有的工作,而另外兩個(gè)根本沒(méi)有數(shù)據(jù)包。這是因?yàn)閔ash沖突,但是這次是在SO_REUSEPORT層。

結(jié)束語(yǔ)

我做了一些進(jìn)一步的測(cè)試,完全一致的RX隊(duì)列,接收線程在單個(gè)NUMA節(jié)點(diǎn)可以達(dá)到1.4Mpps。在不同的NUMA節(jié)點(diǎn)上運(yùn)行接收者會(huì)導(dǎo)致這個(gè)數(shù)字做多下降到1Mpps。

總之,如果你想要一個(gè)完美的性能,你需要做下面這些:

確保流量均勻分布在許多RX隊(duì)列和SO_REUSEPORT進(jìn)程上。在實(shí)踐中,只要有大量的連接(或流動(dòng)),負(fù)載通常是分布式的。

需要有足夠的CPU容量去從內(nèi)核上獲取數(shù)據(jù)包。

To make the things harder, both RX queues and receiver processes should be on a single NUMA node.

為了使事情更加穩(wěn)定,RX隊(duì)列和接收進(jìn)程都應(yīng)該在單個(gè)NUMA節(jié)點(diǎn)上。

純軟件開(kāi)發(fā)人員怎樣做嵌入式linux應(yīng)用開(kāi)發(fā)

二:Linux基礎(chǔ) Linux操作系統(tǒng)的概念、安裝方法,詳細(xì)了解Linux下的目錄結(jié)構(gòu)、基本命令、編輯器VI ,編譯器GCC,調(diào)試器GDB和 Make 項(xiàng)目管理工具, Shell Makefile腳本編寫(xiě)等知識(shí),嵌入式開(kāi)發(fā)環(huán)慶歷境的搭建。

三:Linux系統(tǒng)編程 重點(diǎn)學(xué)習(xí)標(biāo)準(zhǔn)I/O庫(kù),頌仔Linux多任務(wù)編程中的多進(jìn)程和多線程,以及進(jìn)程間通信(pipe、FIFO、消息隊(duì)列、共享內(nèi)存、signal、信號(hào)量等),同步與互斥對(duì)共享資源訪問(wèn)控制等重要知識(shí),主要提升對(duì)Linux應(yīng)用開(kāi)發(fā)的理解和代碼調(diào)試的能力。

四:Linux網(wǎng)絡(luò)編程 計(jì)算機(jī)網(wǎng)絡(luò)在嵌入式Linux系統(tǒng)應(yīng)用開(kāi)發(fā)過(guò)程中使用非常廣泛,通過(guò)Linux網(wǎng)絡(luò)發(fā)展、TCP/IP協(xié)議、socket編程、TCP網(wǎng)絡(luò)編程、UDP網(wǎng)絡(luò)編程、Web編程開(kāi)發(fā)等方面入手,全面了解譽(yù)櫻搜Linux網(wǎng)絡(luò)應(yīng)用程序開(kāi)發(fā)。重點(diǎn)學(xué)習(xí)網(wǎng)絡(luò)編程相關(guān)API,熟練掌握TCP協(xié)議服務(wù)器的編程方法和并發(fā)服務(wù)器的實(shí)現(xiàn),了解HTTP協(xié)議及其實(shí)現(xiàn)方法,熟悉UDP廣播、多播的原理及編程方法,掌握混合C/S架構(gòu)網(wǎng)絡(luò)通信系統(tǒng)的設(shè)計(jì),熟悉HTML,Javascript等Web編程技術(shù)及實(shí)現(xiàn)方法。

五:數(shù)據(jù)結(jié)構(gòu)與算法 數(shù)據(jù)結(jié)構(gòu)及算法在嵌入式底層驅(qū)動(dòng)、通信協(xié)議、及各種引擎開(kāi)發(fā)中會(huì)得到大量應(yīng)用,對(duì)其掌握的好壞直接影響程序的效率、簡(jiǎn)潔及健壯性。此階段的學(xué)習(xí)要重點(diǎn)理解數(shù)據(jù)結(jié)構(gòu)與算法的基礎(chǔ)內(nèi)容,包括順序表、鏈表、隊(duì)列、棧、樹(shù)、圖、哈希表、各種查找排序算法等應(yīng)用及其C語(yǔ)言實(shí)現(xiàn)過(guò)程。

關(guān)于linux 多線程隊(duì)列的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

成都網(wǎng)站設(shè)計(jì)制作選創(chuàng)新互聯(lián),專(zhuān)業(yè)網(wǎng)站建設(shè)公司。
成都創(chuàng)新互聯(lián)10余年專(zhuān)注成都高端網(wǎng)站建設(shè)定制開(kāi)發(fā)服務(wù),為客戶提供專(zhuān)業(yè)的成都網(wǎng)站制作,成都網(wǎng)頁(yè)設(shè)計(jì),成都網(wǎng)站設(shè)計(jì)服務(wù);成都創(chuàng)新互聯(lián)服務(wù)內(nèi)容包含成都網(wǎng)站建設(shè),小程序開(kāi)發(fā),營(yíng)銷(xiāo)網(wǎng)站建設(shè),網(wǎng)站改版,服務(wù)器托管租用等互聯(lián)網(wǎng)服務(wù)。


名稱(chēng)欄目:Linux 多線程隊(duì)列:高效處理任務(wù)的利器 (linux 多線程隊(duì)列)
本文URL:http://www.dlmjj.cn/article/dpcedip.html