调度域(sched domains)和CPU集(cpusets)
一、 内核时间(kernel time)
1. 时钟类型
l RTC (Real time clock):真实时间(BIOS硬件时间,用于稳定系统时间,不受操作系统影响,保证系统重启后时间的稳定)
l TSC(time stamp counter):时间戳计时器(用于系统的更新(注册到ntp中等),比RTC更精确。
l APIC(Advaced Programmable Interrupt Controller):高级可编程中断控制器,可编程时钟
l PIC(Programmable Interrupt counter):可编程中断计数器
#PIC通常使用IRQ 0的中断号
#默认频率 standard:1000HZ(1 tick is 1ms,每1毫秒嘀哒一次)
Kernel-xen:250HZ (1 tick 4ms,每4毫秒嘀哒一次)
2. 调整系统(CPU)时钟(嘀哒)频率(系统所用时钟都采用嘀哒机制)
l 内核启动参数
tick_devider=value
#内核启动参数,写在/etc/grub.conf中kernel行。仅用于X86和X86_64,Xen中不可使用.
l value值和对应频率:
2 = 500 HZ
4 = 250 HZ
5 = 200 HZ
10 = 100 HZ
#value值高则会降低cpu的频率,减小cpu负载开销
3. 调CPU速度
未使用的CPU时钟会增加系统能量的消耗,可在不影响系统性能的情况下,调整cpu时钟。
l 开启/etc/init.d/cpuspeed服务,通过系统自动调整
[root@station9 ~]# /etc/init.d/cpuspeed start
#默认系统会自动启动此服务, kernel-xen不适用
l 修改配置文件/etc/sysconfig/cpuspeed,配置{MAX,MIN}_SPEED,CPU的最大和最小速度
[root@station9 ~]# vim /etc/sysconfig/cpuspeed
MAX_SPEED=
MIN_SPEED=
二、 IRQ的均衡机制(IRQ balancing)
IRQ硬件的中断总是优先与进程的优先级。
1. 查看当前IRQ信息
l procinfo
[root@station9 ~]# procinfo
Linux 2.6.18-194.el5PAE ([email protected]) (gcc 4.1.2 20080704 ) #1 4CPU [station9.(none)]
Memory: Total Used Free Shared Buffers
Mem: 4151768 854020 3297748 0 168964
Swap: 8385920 0 8385920
Bootup: Thu Aug 18 11:48:29 2011 Load average: 0.02 0.02 0.00 1/141 9777
user : 0:01:30.53 0.0% page in : 0
nice : 0:00:30.21 0.0% page out: 0
system: 0:00:50.16 0.0% swap in : 0
idle : 3d 22:20:16.70 99.9% swap out: 0
steal : 0:00:00.00 0.0%
uptime: 23:35:57.11 context : 45141770
irq 0: 84964173 timer irq 74: 0 uhci_hcd:usb4
irq 1: 3 i8042 irq 82: 3371860 ehci_hcd:usb1, uhci_
irq 3: 5 irq 90: 45 uhci_hcd:usb3
irq 4: 4 irq 98: 0 ahci
irq 8: 3 rtc irq154: 1
irq 9: 0 acpi irq162: 100856 0 0 100
irq 12: 4 i8042 irq177: 49130 ioc0
l cat /proc/interrupts
[root@station9 ~]# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
0: 84971583 21518 21524 21505 IO-APIC-edge timer
1: 0 1 1 1 IO-APIC-edge i8042
8: 0 2 1 0 IO-APIC-edge rtc
9: 0 0 0 0 IO-APIC-level acpi
12: 1 2 0 1 IO-APIC-edge i8042
74: 0 0 0 0 IO-APIC-level uhci_hcd:usb4
82: 154 139 1687180 1687187 IO-APIC-level ehci_hcd:usb1, uhci_hcd:usb2
90: 11 12 8 14 IO-APIC-level uhci_hcd:usb3
98: 0 0 0 0 IO-APIC-level ahci
162: 22 0 0 100959 PCI-MSI eth0
177: 1353 1324 23233 23239 IO-APIC-level ioc0
NMI: 0 0 0 0
LOC: 85031712 85031718 85031713 85031719
ERR: 0
MIS: 0
2. irqbalance
l irqbalance主要功能:
可以合理的调配使用各个CPU核心,特别是对于目前主流多核心的CPU,简单的说就是能够把压力均匀的分配到各个CPU核心上,对提升性能有很大的帮助。
irqbalance 用于优化中断分配,它会自动收集系统数据以分析使用模式,并依据系统负载状况将工作状态置于 Performance mode 或 Power-save mode。
处于 Performance mode 时,irqbalance 会将中断尽可能均匀地分发给各个 CPU core,以充分利用 CPU 多核,提升性能。
处于 Power-save mode 时,irqbalance 会将中断集中分配给第一个 CPU,以保证其它空闲 CPU 的睡眠时间,降低能耗。
irqbalance默认每10s会移动一次IRQ,即重新分配一次IRQ信息,将其分配给指定的CPU。
l 开启irqbalance机制
[root@station9 ~]# /etc/init.d/irqbalance start
[root@station9 ~]# chkconfig irqbalance on
#系统默认会启动该服务,配置文件/etc/sysconfig/irqbalance。
3. IRQ Affinity(绑定硬件中断IRQ到指定 CPU)
l 关闭irqbalance服务
手动绑定 IRQ 到 CPU 之前需要先停掉 irqbalance 这个服务,irqbalance用来自动绑定和平衡 IRQ。
[root@station9 ~]# /etc/init.d/irqbalance stop
[root@station9 ~]# chkconfig irqbalance off
l echo cpu_mask > /proc/irq/<interrupt_number>/smp_affinity
#为保证系统重启生效需set smp_affinity for every IRQ in /etc/rc.local
[root@station9 proc]# more interrupts
CPU0 CPU1 CPU2 CPU3
162: 22 0 0 109470 PCI-MSI eth0
#只截取了eth0的信息,处理eth0中断的主要是cpu3(即第4颗CPU) [root@station9 ~]# echo 1 >/proc/irq/162/smp_affinity
#将eth0绑定到cpu0(第1颗CPU上)
[root@station9 ~]# more /proc/interrupts |grep eth0
CPU0 CPU1 CPU2 CPU3
162: 388 0 0 109470 PCI-MSI eth0
#显示处理eth0中断的变成cpu0了
l cpu_mask或smp_affinity计算
/proc/irq/162/smp_affinity” 中的 ”1“ 是怎么来的,这其实是个二进制数字,代表 0000001,00000001 代表 CPU0 的话,00000010 就代表 CPU0, “echo 1 > /proc/irq/162/smp_affinity” 的意思就是说把 162中断绑定到 00000001(CPU0)上。所以各个 CPU 用二进制和十六进制表示就是:
Binary Hex #个人计算方法
CPU 0 00000001 1 2的0次方
CPU 1 00000010 2 2的1次方
CPU 2 00000100 4 2的2次方
CPU 3 00001000 8 2的3次方
如果我想把 IRQ 绑定到 CPU2 上就是 00000100=4:
[root@station9 ~]# echo "4" > /proc/irq/162/smp_affinity
如果我想把 IRQ 同时平衡到 CPU0 和 CPU2 上就是 00000001+00000100=00000101=5 (2的0次方+2的2次方=5)
[root@station9 ~]# echo "5" > /proc/irq/162/smp_affinity