自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux技巧:多核下綁定硬件/進(jìn)程到不同CPU

系統(tǒng) Linux
現(xiàn)在的服務(wù)器上動(dòng)不動(dòng)就是多 CPU 多核、多網(wǎng)卡、多硬盤,如果能讓一個(gè)硬件單獨(dú)占用一個(gè)CPU,將能夠大大減輕單一CPU的負(fù)擔(dān)。本文介紹如何在多核CPU情況下將硬件以及進(jìn)程綁定到不同的CPU。

硬件中斷發(fā)生頻繁,是件很消耗 CPU 資源的事情,在多核 CPU 條件下如果有辦法把大量硬件中斷分配給不同的 CPU (core) 處理顯然能很好的平衡性能?,F(xiàn)在的服務(wù)器上動(dòng)不動(dòng)就是多 CPU 多核、多網(wǎng)卡、多硬盤,如果能讓網(wǎng)卡中斷獨(dú)占1個(gè) CPU (core)、磁盤 IO 中斷獨(dú)占1個(gè) CPU 的話將會(huì)大大減輕單一 CPU 的負(fù)擔(dān)、提高整體處理效率。我前天收到一位網(wǎng)友的郵件提到了 SMP IRQ Affinity,引發(fā)了今天的話題。以下操作在 SUN FIre X2100 M2 服務(wù)器+ 64位版本 CentOS 5.5 + Linux 2.6.18-194.3.1.el5 上執(zhí)行。

什么是中斷

中文教材上對(duì) “中斷” 的定義太生硬了,簡(jiǎn)單的說就是,每個(gè)硬件設(shè)備(如:硬盤、網(wǎng)卡等)都需要和 CPU 有某種形式的通信以便 CPU 及時(shí)知道發(fā)生了什么事情,這樣 CPU 可能就會(huì)放下手中的事情去處理應(yīng)急事件,硬件設(shè)備主動(dòng)打擾 CPU 的現(xiàn)象就可稱為硬件中斷,就像你正在工作的時(shí)候受到 QQ 干擾一樣,一次 QQ 搖頭就可以被稱為中斷。

中斷是一種比較好的 CPU 和硬件溝通的方式,還有一種方式叫做輪詢(polling),就是讓 CPU 定時(shí)對(duì)硬件狀態(tài)進(jìn)行查詢?nèi)缓笞鱿鄳?yīng)處理,就好像你每隔5分鐘去檢查一下 QQ 看看有沒有人找你一樣,這種方式是不是很浪費(fèi)你(CPU)的時(shí)間?所以中斷是硬件主動(dòng)的方式,比輪詢(CPU 主動(dòng))更有效一些。

好了,這里又有了一個(gè)問題,每個(gè)硬件設(shè)備都中斷,那么如何區(qū)分不同硬件呢?不同設(shè)備同時(shí)中斷如何知道哪個(gè)中斷是來自硬盤、哪個(gè)來自網(wǎng)卡呢?這個(gè)很容易,不是每個(gè) QQ 號(hào)碼都不相同嗎?同樣的,系統(tǒng)上的每個(gè)硬件設(shè)備都會(huì)被分配一個(gè) IRQ 號(hào),通過這個(gè)唯一的 IRQ 號(hào)就能區(qū)別張三和李四了。

在計(jì)算機(jī)里,中斷是一種電信號(hào),由硬件產(chǎn)生,并直接送到中斷控制器(如 8259A)上,然后再由中斷控制器向 CPU 發(fā)送信號(hào),CPU 檢測(cè)到該信號(hào)后,就中斷當(dāng)前的工作轉(zhuǎn)而去處理中斷。然后,處理器會(huì)通知操作系統(tǒng)已經(jīng)產(chǎn)生中斷,這樣操作系統(tǒng)就會(huì)對(duì)這個(gè)中斷進(jìn)行適當(dāng)?shù)奶幚怼,F(xiàn)在來看一下中斷控制器,常見的中斷控制器有兩種:可編程中斷控制器 8259A 和高級(jí)可編程中斷控制器(APIC),中斷控制器應(yīng)該在大學(xué)的硬件接口和計(jì)算機(jī)體系結(jié)構(gòu)的相關(guān)課程中都學(xué)過。傳統(tǒng)的 8259A 只適合單 CPU 的情況,現(xiàn)在都是多 CPU 多核的 SMP 體系,所以為了充分利用 SMP 體系結(jié)構(gòu)、把中斷傳遞給系統(tǒng)上的每個(gè) CPU 以便更好實(shí)現(xiàn)并行和提高性能,Intel 引入了高級(jí)可編程中斷控制器(APIC)。

光有高級(jí)可編程中斷控制器的硬件支持還不夠,Linux 內(nèi)核還必須能利用到這些硬件特質(zhì),所以只有 kernel 2.4 以后的版本才支持把不同的硬件中斷請(qǐng)求(IRQs)分配到特定的 CPU 上,這個(gè)綁定技術(shù)被稱為 SMP IRQ Affinity. 更多介紹請(qǐng)參看 Linux 內(nèi)核源代碼自帶的文檔:linux-2.6.31.8/Documentation/IRQ-affinity.txt

如何使用

先看看系統(tǒng)上的中斷是怎么分配在 CPU 上的,很顯然 CPU0 上處理的中斷多一些:

# cat /proc/interrupts
           CPU0       CPU1
  0:  918926335          0    IO-APIC-edge  timer
  1:          2          0    IO-APIC-edge  i8042
  8:          0          0    IO-APIC-edge  rtc
  9:          0          0   IO-APIC-level  acpi
 12:          4          0    IO-APIC-edge  i8042
 14:    8248017          0    IO-APIC-edge  ide0
 50:        194          0   IO-APIC-level  ohci_hcd:usb2
 58:      31673          0   IO-APIC-level  sata_nv
 90:    1070374          0         PCI-MSI  eth0
233:         10          0   IO-APIC-level  ehci_hcd:usb1
NMI:       5077       2032
LOC:  918809969  918809894
ERR:          0
MIS:          0

為了不讓 CPU0 很累怎么把部分中斷轉(zhuǎn)移到 CPU1 上呢?或者說如何把 eth0 網(wǎng)卡的中斷轉(zhuǎn)到 CPU1 上呢?先查看一下 IRQ 90 中斷的 smp affinity,看看當(dāng)前中斷是怎么分配在不同 CPU 上的(ffffffff 意味著分配在所有可用 CPU 上):

# cat /proc/irq/90/smp_affinity
7fffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff

在進(jìn)一步動(dòng)手之前我們需要先停掉 IRQ 自動(dòng)調(diào)節(jié)的服務(wù)進(jìn)程,這樣才能手動(dòng)綁定 IRQ 到不同 CPU,否則自己手動(dòng)綁定做的更改將會(huì)被自動(dòng)調(diào)節(jié)進(jìn)程給覆蓋掉。如果想修改 IRQ 90 的中斷處理,綁定到第2個(gè) CPU(CPU1):

# /etc/init.d/irqbalance stop
# echo "2" > /proc/irq/90/smp_affinity

過段時(shí)間在看 /proc/interrupts,是不是 90:eth0 在 CPU1 上的中斷增加了(145)、在 CPU0 上的中斷沒變?不斷打印 /proc/interrupts 就會(huì)發(fā)現(xiàn) eth0 在 CPU0 上的中斷數(shù)始終保持不變,而在 CPU1 上的中斷數(shù)是持續(xù)增加的,這正是我們想要的結(jié)果:

# cat /proc/interrupts
           CPU0       CPU1
  0:  922506515          0    IO-APIC-edge  timer
  1:          2          0    IO-APIC-edge  i8042
  8:          0          0    IO-APIC-edge  rtc
  9:          0          0   IO-APIC-level  acpi
 12:          4          0    IO-APIC-edge  i8042
 14:    8280147          0    IO-APIC-edge  ide0
 50:        194          0   IO-APIC-level  ohci_hcd:usb2
 58:      31907          0   IO-APIC-level  sata_nv
 90:    1073399        145         PCI-MSI  eth0
233:         10          0   IO-APIC-level  ehci_hcd:usb1
NMI:       5093       2043
LOC:  922389696  922389621
ERR:          0
MIS:          0

有什么用

在網(wǎng)絡(luò)非常 heavy 的情況下,對(duì)于文件服務(wù)器、高流量 Web 服務(wù)器這樣的應(yīng)用來說,把不同的網(wǎng)卡 IRQ 均衡綁定到不同的 CPU 上將會(huì)減輕某個(gè) CPU 的負(fù)擔(dān),提高多個(gè) CPU 整體處理中斷的能力;對(duì)于數(shù)據(jù)庫服務(wù)器這樣的應(yīng)用來說,把磁盤控制器綁到一個(gè) CPU、把網(wǎng)卡綁定到另一個(gè) CPU 將會(huì)提高數(shù)據(jù)庫的響應(yīng)時(shí)間、優(yōu)化性能。合理的根據(jù)自己的生產(chǎn)環(huán)境和應(yīng)用的特點(diǎn)來平衡 IRQ 中斷有助于提高系統(tǒng)的整體吞吐能力和性能。

本人經(jīng)常收到網(wǎng)友來信問到如何優(yōu)化 Linux、優(yōu)化 VPS、這個(gè)問題不太好回答,要記住的是性能優(yōu)化是一個(gè)過程而不是結(jié)果,不是看了些文檔改了改參數(shù)就叫優(yōu)化了,后面還需要大量的測(cè)試、監(jiān)測(cè)以及持續(xù)的觀察和改進(jìn)。

#p#

綁定進(jìn)程到不同CPU

介紹了在 Linux 多核下如何綁定硬件中斷到不同 CPU,其實(shí)也可以用類似的做法把進(jìn)程手動(dòng)分配到特定的 CPU 上,平時(shí)在 Linux 上運(yùn)行的各種進(jìn)程都是由 Linux 內(nèi)核統(tǒng)一分配和管理的,由進(jìn)程調(diào)度算法來決定哪個(gè)進(jìn)程可以開始使用 CPU、哪個(gè)進(jìn)程需要睡眠或等待、哪個(gè)進(jìn)程運(yùn)行在哪個(gè) CPU 上等。如果你對(duì)操作系統(tǒng)的內(nèi)核和進(jìn)程調(diào)度程序感興趣的話,不妨看看那本經(jīng)典的 Operating Systems Design and Implementation(Linus Torvalds 就是看了這本書受到啟發(fā)寫出了 Linux),從簡(jiǎn)單的 Minix 入手,hack 內(nèi)核是件很有意思的事情,本人以前修改過 Minix 內(nèi)核的進(jìn)程調(diào)度,學(xué)到了內(nèi)核方面的很多東西。另外推薦一本課外讀物:Just for Fun,Linus Torvalds 寫的一本自傳。

Linux 給我們提供了方便的工具用來手動(dòng)分配進(jìn)程到不同的 CPU 上(CPU Affinity),這樣我們可以按照服務(wù)器和應(yīng)用的特性來安排特定的進(jìn)程到特定的 CPU 上,比如 Oracle 要消耗大量 CPU 和 I/O 資源,如果我們能分配 Oracle 進(jìn)程到某個(gè)或多個(gè) CPU 上并由這些 CPU 專門處理 Oracle 的話會(huì)毫無疑問的提高應(yīng)用程序的響應(yīng)和性能。還有一些特殊情況是必須綁定應(yīng)用程序到某個(gè) CPU 上的,比如某個(gè)軟件的授權(quán)是單 CPU 的,如果想運(yùn)行在多 CPU 機(jī)器上的話就必須限制這個(gè)軟件到某一個(gè) CPU 上。

安裝 schedutils

在 CentOS/Fedora 下安裝 schedutils:

# yum install schedutils

在 Debian/Ubuntu 下安裝 schedutils:

# apt-get install schedutils

如果正在使用 CentOS/Fedora/Debian/Ubuntu 的最新版本的話,schedutils/util-linux 這個(gè)軟件包可能已經(jīng)裝上了。

計(jì)算 CPU Affinity 和計(jì)算 SMP IRQ Affinity 差不多:

0x00000001    (CPU0)
0x00000002    (CPU1)
0x00000003    (CPU0+CPU1)
0x00000004    (CPU2)
...

使用 schedutils

如果想設(shè)置進(jìn)程號(hào)(PID)為 12212 的進(jìn)程到 CPU0 上的話:

# taskset 0x00000001 -p 12212

【編輯推薦】

  1. Linux定時(shí)執(zhí)行任務(wù)命令概述:at和crontab
  2. Linux系統(tǒng)管理員:不要害怕升級(jí)內(nèi)核
  3. 超實(shí)用的Linux/Unix快捷鍵大匯總(開發(fā)、管理)
責(zé)任編輯:yangsai 來源: vpsee.com
相關(guān)推薦

2021-07-07 10:05:38

進(jìn)程CPULinux

2009-12-30 10:15:57

Silverlight

2021-06-15 08:02:55

Linux 進(jìn)程管理

2020-11-17 10:50:37

Python

2022-09-15 08:38:39

WebCPU數(shù)量

2013-10-30 09:37:19

LinuxLinux命令

2023-04-12 15:37:31

Linux系統(tǒng)CPU

2009-06-03 15:27:07

CPU網(wǎng)絡(luò)優(yōu)化網(wǎng)康

2010-07-28 13:11:13

Flex數(shù)據(jù)綁定

2009-12-14 13:48:01

龍芯65納米

2021-10-17 19:49:52

CPURedis緩存

2009-12-14 14:43:50

Linux內(nèi)核

2015-08-13 13:44:21

優(yōu)化多核

2015-09-29 09:34:53

LinuxCPU內(nèi)核

2010-08-12 11:34:15

Flex數(shù)據(jù)綁定

2010-07-30 09:08:21

Flex數(shù)據(jù)綁定

2009-06-03 18:38:07

多核CPU網(wǎng)絡(luò)

2012-05-04 09:10:50

多核CPUwindows

2009-07-02 13:40:45

面試

2019-12-16 09:10:38

Linux中央處理器進(jìn)程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)