cpu 调优.doc_第1页
cpu 调优.doc_第2页
cpu 调优.doc_第3页
cpu 调优.doc_第4页
cpu 调优.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一)中断的CPU亲和性我们可以调整中断到某个CPU上,这样可以让CPU更有效的利用起来.首先关闭掉irqbalance服务,如下:/etc/init.d/irqbalance stopStopping irqbalance: OK 查看当前各种中断所使用的CPU,如下:for f in find . -name smp_affinity; do echo -ne $f- & cat $f; done./18/smp_affinity-1./17/smp_affinity-3./15/smp_affinity-1./14/smp_affinity-1./13/smp_affinity-3./12/smp_affinity-1./11/smp_affinity-3./10/smp_affinity-3./9/smp_affinity-3./8/smp_affinity-3./7/smp_affinity-3./6/smp_affinity-3./5/smp_affinity-3./4/smp_affinity-3./3/smp_affinity-3./2/smp_affinity-3./1/smp_affinity-3./0/smp_affinity-3查看中断使用率,如下:cat /proc/interrupts CPU0 CPU1 0: 137 0 IO-APIC-edge timer 1: 7 1 IO-APIC-edge i8042 3: 0 1 IO-APIC-edge 4: 1 0 IO-APIC-edge 7: 0 0 IO-APIC-edge parport0 8: 0 0 IO-APIC-edge rtc0 9: 0 0 IO-APIC-fasteoi acpi12: 103 2 IO-APIC-edge i804214: 2301 628 IO-APIC-edge ata_piix15: 116 49 IO-APIC-edge ata_piix17: 15 0 IO-APIC-fasteoi ioc018: 4122 39 IO-APIC-fasteoi eth0NMI: 0 0 Non-maskable interruptsLOC: 18423 16772 Local timer interruptsSPU: 0 0 Spurious interruptsPMI: 0 0 Performance monitoring interruptsPND: 0 0 Performance pending workRES: 2740 2914 Rescheduling interruptsCAL: 110 1349 Function call interruptsTLB: 339 421 TLB shootdownsTRM: 0 0 Thermal event interruptsTHR: 0 0 Threshold APIC interruptsMCE: 0 0 Machine check exceptionsMCP: 3 3 Machine check pollsERR: 0MIS: 0我们看一下18号中断下的相关文件,如下:cd /proc/irq/18/ & lsaffinity_hint eth0 node smp_affinity spurious我们看下它使用的CPU.more smp_affinity1注:这里输出为1表示,它使用了第一个CPU,1对映的两进制掩码也是1.如果它使用前两个CPU,那么这里就是3,即二进制的11.如果我们有4个处理器,这里的值就应该是F,也就是二进制1111.如果我们只要第2个处理器进行处理,这里的值就应该是2,因为2的二进制是10.我们在另一台服务器ping本机,如下:ping 192.168.75.13564 bytes from 192.168.75.135: icmp_seq=3454 ttl=64 time=2.80 ms64 bytes from 192.168.75.135: icmp_seq=3455 ttl=64 time=3.80 ms64 bytes from 192.168.75.135: icmp_seq=3456 ttl=64 time=0.814 ms64 bytes from 192.168.75.135: icmp_seq=3457 ttl=64 time=0.293 ms64 bytes from 192.168.75.135: icmp_seq=3458 ttl=64 time=1.84 ms64 bytes from 192.168.75.135: icmp_seq=3459 ttl=64 time=0.265 ms64 bytes from 192.168.75.135: icmp_seq=3460 ttl=64 time=0.021 ms64 bytes from 192.168.75.135: icmp_seq=3461 ttl=64 time=0.793 ms64 bytes from 192.168.75.135: icmp_seq=3462 ttl=64 time=0.285 ms64 bytes from 192.168.75.135: icmp_seq=3463 ttl=64 time=0.038 ms64 bytes from 192.168.75.135: icmp_seq=3464 ttl=64 time=0.936 ms64 bytes from 192.168.75.135: icmp_seq=3465 ttl=64 time=0.279 ms64 bytes from 192.168.75.135: icmp_seq=3466 ttl=64 time=0.706 ms在本机监控网卡中断分布,如下:while (1) ; do sleep 1; cat /proc/interrupts |grep eth0; done18: 5568 39 IO-APIC-fasteoi eth018: 5570 39 IO-APIC-fasteoi eth018: 5576 39 IO-APIC-fasteoi eth018: 5580 39 IO-APIC-fasteoi eth018: 5584 39 IO-APIC-fasteoi eth018: 5590 39 IO-APIC-fasteoi eth018: 5592 39 IO-APIC-fasteoi eth018: 5598 39 IO-APIC-fasteoi eth018: 5604 39 IO-APIC-fasteoi eth018: 5606 39 IO-APIC-fasteoi eth018: 5612 39 IO-APIC-fasteoi eth018: 5616 39 IO-APIC-fasteoi eth018: 5620 39 IO-APIC-fasteoi eth018: 5626 39 IO-APIC-fasteoi eth018: 5628 39 IO-APIC-fasteoi eth018: 5634 39 IO-APIC-fasteoi eth018: 5638 39 IO-APIC-fasteoi eth018: 5641 39 IO-APIC-fasteoi eth018: 5647 39 IO-APIC-fasteoi eth018: 5650 39 IO-APIC-fasteoi eth018: 5656 39 IO-APIC-fasteoi eth0我们看到当前的中断(第二列)即所有的网卡中断请求都分布到了CPU0.我们这里指定前两个CPU做为处理网卡请求,如下:echo 3 smp_affinitywhile (1) ; do sleep 1; cat /proc/interrupts |grep eth0; done18: 6430 50 IO-APIC-fasteoi eth018: 6433 53 IO-APIC-fasteoi eth018: 6439 53 IO-APIC-fasteoi eth018: 6441 53 IO-APIC-fasteoi eth018: 6443 57 IO-APIC-fasteoi eth018: 6444 58 IO-APIC-fasteoi eth018: 6447 61 IO-APIC-fasteoi eth018: 6449 61 IO-APIC-fasteoi eth018: 6453 63 IO-APIC-fasteoi eth018: 6459 63 IO-APIC-fasteoi eth018: 6459 65 IO-APIC-fasteoi eth018: 6462 68 IO-APIC-fasteoi eth018: 6463 69 IO-APIC-fasteoi eth018: 6467 71 IO-APIC-fasteoi eth018: 6469 71 IO-APIC-fasteoi eth018: 6472 73 IO-APIC-fasteoi eth0注:我们看到网卡的中断请求已经平均的分配到了两个CPU.二)isolcpus通过在grub中设定isolcpus内核参数可以指定哪几个CPU在系统中是孤立的,也就是说默认它们将不被使用.测试如下:编辑/boot/grub/menu.list在加载内核的选项后加入isolcpus=0,如下:kernel /boot/vmlinuz-2.6.32-71.el6.i686 ro root=UUID=96262e00-91a3-432d-b225-cb35d29eec8f rhgb quiet isolcpus=0也就是说我们在启动系统时将默认不使用CPU0,注意这里说的默认不使用并不是绝对的,操作系统仍然可以指定使用哪个CPU.对于用户而言可以通过taskset来做到这点.重启系统后,我们查看进程的亲和性,如下:ps -eo pid,args:50,psr PID COMMAND PSR 1 /sbin/init 1 2 kthreadd 0 3 migration/0 0 4 ksoftirqd/0 0 5 watchdog/0 0 6 migration/1 1 7 ksoftirqd/1 1 8 watchdog/1 1 9 events/0 0 10 events/1 1 11 cpuset 0 12 khelper 0 13 netns 0 14 async/mgr 0 15 pm 0 16 sync_supers 1 17 bdi-default 0 18 kintegrityd/0 0 19 kintegrityd/1 1 20 kblockd/0 0 21 kblockd/1 1 22 kacpid 0 23 kacpi_notify 0 24 kacpi_hotplug 0 25 ata/0 0 26 ata/1 1 27 ata_aux 0 28 ksuspend_usbd 0 29 khubd 0 30 kseriod 0 33 khungtaskd 0 34 kswapd0 0 35 ksmd 0 36 aio/0 0 37 aio/1 1 38 crypto/0 0 39 crypto/1 1 45 kpsmoused 0 46 usbhid_resumer 0 75 kstriped 0 239 scsi_eh_0 0 240 scsi_eh_1 0 250 mpt_poll_0 0 251 mpt/0 0 252 scsi_eh_2 0 301 jbd2/sda1-8 0 302 ext4-dio-unwrit 0 303 ext4-dio-unwrit 1 324 flush-8:0 0 390 /sbin/udevd -d 1 643 /sbin/udevd -d 1 644 /sbin/udevd -d 1 731 kauditd 01004 auditd 11029 /sbin/rsyslogd -c 4 11062 irqbalance 11081 rpcbind 11093 mdadm -monitor -scan -f -pid-file=/var/run/mdad 11102 dbus-daemon -system 11113 NetworkManager -pid-file=/var/run/NetworkManager/ 11117 /usr/sbin/modem-manager 11124 /sbin/dhclient -d -4 -sf /usr/libexec/nm-dhcp-clie 11129 /usr/sbin/wpa_supplicant -c /etc/wpa_supplicant/wp 11131 avahi-daemon: registering linux.local 11132 avahi-daemon: chroot helper 11149 rpc.statd 11186 rpciod/0 01187 rpciod/1 11194 rpc.idmapd 11204 cupsd -C /etc/cups/cupsd.conf 11229 /usr/sbin/acpid 11238 hald 11239 hald-runner 11279 hald-addon-input: Listening on /dev/input/event2 / 11283 hald-addon-acpi: listening on acpid socket /var/ru 11303 automount -pid-file /var/run/autofs.pid 11326 /usr/sbin/sshd 11456 /usr/libexec/postfix/master 11463 pickup -l -t fifo -u 11464 qmgr -l -t fifo -u 11467 /usr/sbin/abrtd 11475 crond 11486 /usr/sbin/atd 11497 libvirtd -daemon 11553 /sbin/mingetty /dev/tty1 11558 /sbin/mingetty /dev/tty2 11561 /sbin/mingetty /dev/tty3 11564 /sbin/mingetty /dev/tty4 11567 /sbin/mingetty /dev/tty5 11569 /sbin/mingetty /dev/tty6 11586 /usr/sbin/dnsmasq -strict-order -bind-interfaces 11598 sshd: rootpts/0 11603 -bash 1我们看到有一些内核线程比如kblockd/0占用了CPU0,这是因为它指定了在CPU0上执行.其余的进程占用了CPU1.我们这里用一个简单的循环程序测试一下:#include intmain ()while(1)return 0;gcc test.c./a.out&./a.out&./a.out&./a.out&查看a.out进程的程序亲和性,如下:ps -eo pid,args:50,psr |grep a.out1669 ./a.out 11670 ./a.out 11671 ./a.out 11672 ./a.out 11675 grep a.out 1我们看到4个a.out进程都使用了CPU1.这正是我们想看到的.最后要说明的是如果使用isolcpus=1,则系统默认会使用CPU0提供服务.如果我们只有两个cpu,却指定isolcpus=0,1,这时将默认使用CPU0.三)cpu的热插拔在操作系统层面可以对cpu进行热插拔.动态关闭cpu1,如下:echo 0 /sys/devices/system/cpu/cpu1/online 此时我们在系统中,只能看到1个CPU了.cat /proc/cpuinfoprocessor : 0vendor_id : AuthenticAMDcpu family : 15model : 107model name : AMD Sempron(tm) Dual Core Processor 2300stepping : 2cpu MHz : 2210.053cache size : 256 KBfdiv_bug : nohlt_bug : nof00f_bug : nocoma_bug : nofpu : yesfpu_exception : yescpuid level : 1wp : yesflags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow constant_tsc up tsc_reliable extd_apicid pni cx16 lahf_lm extapic 3dnowprefetchbogomips : 4420.10clflush size : 64cache_alignment : 64address sizes : 36 bits physical, 48 bits virtualpower management: ts fid vid ttp tm stc 100mhzsteps注意,如果运行的程序跑在cpu1上,如果把cpu1关闭,则程序会迁移到cpu0上.另外cpu0是不可以被关闭的,在cpu0的sys文件系统中没有online文件.四)进程/线程的亲和性和taskset的应用1)概述:1)CPU的亲和性分为软亲合性和硬亲合性,软亲合性是使进程并不会在处理器之间频繁迁移.硬亲合性是使进程需要在您指定的处理器上运行,Linux默认是软亲合性的,所以Linux会试图保持进程在相同的CPU上运行,因为这样再次应用TLB将成为可能.2)Linux系统通过亲和性掩码使应用程序使用哪个CPU来运行程序,Linux默认的亲合性掩码是使用所有的CPU.3)应用程序可以在启动时指定亲和性掩码,提交给调度系统,也可以在应用程序运行中调整它的亲和性掩码.2)用taskset手工调整一个进程的亲和性我们先弄一个最简单的程序,它是一个死循环,如下:#include intmain () while(1) return 0;编译并运行:gcc taskloop.c -o taskloop./taskloop我们在另一个终端查看该进程的状态,如下:ps -eo pid,args:30,psrPID COMMAND PSR2826 ./taskloop 0注:上面的ps输出,我们只保留了taskloop一行,PSR代表我们的程序用了哪个CPU,如果有两个CPU,就分别CPU0,CPU1,也就是从0开始.我们中止这个程序,用taskset来指定它用CPU1来运行,如下:taskset 2 ./taskloop我们在另一个终端查看该进程的状态,如下:ps -eo pid,args:30,psrPID COMMAND PSR2892 ./taskloop 1注:通过taskset对亲合性掩码的设定,我们选择了CPU1来运行这个程序,这里要说明的是taskset指定的掩码是从1开始计算的,我们指定用CPU1,就得用taskset 2 COMMAND来设定.下面是亲合性掩码与CPU的对映,如下:0x00000001是处理器1(CPU0)0x00000002是处理器2(CPU1)0x00000003是处理器1和处理器2(CPU0/CPU1)0x00000004是处理器3(CPU2)0x0000001F是前5个处理器(CPU0,CPU1,CPU2,CPU3,CPU4)0xFFFFFFFF是所有的处理器(即32个处理器)以此类推,上面是十六进制的掩码方式,在taskset中可以用十六进制和十进制两种方式,我们为了方便,在这里只用十进制来表示.同样的我们也可以在程序运行中来改变它的亲合性掩码,从而改变它使用的CPU.上面的taskloop进程使用了CPU1,我们将它改为使用CPU0,如下:taskset -p 1 pgrep taskloop pid 2892s current affinity mask: 2pid 2892s new affinity mask: 1在另一个终端查看该进程的状态:ps -eo pid,args:30,psrPID COMMAND PSR2892 ./taskloop 0注:我们看到原本运行于CPU1的进程改用了CPU0,这里要说明的是如果我们程序在sleep或pause,此时改变它的亲合性掩码但它不会选用新的CPU,只有当sleep或pause结束,它才会应用亲和性掩码.3)进程中的亲合性设置通过sched_setaffinity函数,可以设置CPU的亲和性,让指定的进程运行于指定的CPU上,我们把之前的程序做一下变动,如下:#define _GNU_SOURCE#include #include int main() cpu_set_t mask; CPU_ZERO(&mask); CPU_SET(1,&mask); if(sched_setaffinity(0, sizeof(cpu_set_t), &mask)=-1) printf(sched_setaffinity set error!); while(1) return 0;编译并运行:gcc proaffinity.c -o proaffinity./proaffinity在另一个终端查看该进程的状态:ps -eo pid,args:20,psr|grep proaffinity|grep -v grep 3088 ./proaffinity 1注:在程序中我们用sched_setaffinity函数,设定本程序用亲合性掩码1,也就是用第一个处理器来运行此程序.sched_setaffinity(0, sizeof(cpu_set_t), &mask)函数中的第一个参数是PID,如果是0,则代表进程自己,第二个参数是亲合性掩码的长度,第三个参数是亲合性掩码.CPU_ZERO(&mask)宏调用是清理掩码mask,CPU_SET(1,&mask)是设定掩码mask为1.4)线程中的亲合性设置通过pthread_attr_setaffinity_np函数,设定线程的亲合性掩码,也就是用第几个处理器来运行该线程,如下:#define _GNU_SOURCE#include #include #include int GetCpuCount() return (int)sysconf(_SC_NPROCESSORS_ONLN);void *thread_fun() int i; while(1) i = 0; return NULL;int main() int cpu_num = 0; cpu_num = GetCpuCount(); printf(The number of cpu is %dn, cpu_num); pthread_t t1; pthread_t t2; pthread_attr_t attr1; pthread_attr_t attr2; pthread_attr_init(&attr1); pthread_attr_init(&attr2); cpu_set_t cpu_info; CPU_ZERO(&cpu_info); CPU_SET(0, &cpu_info); if (0!=pthread_attr_setaffinity_np(&attr1, sizeof(cpu_set_t), &cpu_info) printf(set affinity failed); return; CPU_ZERO(&cpu_info); CPU_SET(1, &cpu_info); if (0!=pthread_attr_setaffinity_np(&attr2, sizeof(cpu_set_t), &cpu_info) printf(set affinity failed); if (0!=pthread_create(&t1, &attr1, thread_fun, NULL) printf(create thread 1 errorn); return; if (0!=pthread_create(&t2, &attr2, thread_fun, NULL) printf(create thread 2 errorn); return; pthread_join(t1, NULL); pthread_join(t2, NULL);编译并运行:gcc pthraffinity.c -o pthraffinity -pthread./proaffinity我们在另一个终端查看该进程中所有线程的状态,如下:ps -eLo pid,lwp,args:20,psr PID LWP COMMAND PSR3191 3191 ./pthraffinity 13191 3192 ./pthraffinity 03191 3193 ./pthraffinity 1注:LWP一列为线程ID,我们看到进程(PID=3191)用了CPU0,而第一个线程(LWP=3192)用了CPU1,这正是程序中设定的,而第二个线程(LWP=3193)用了CPU0,这也是程序的意图.五)cgroup1)概述:cgroup它的全称为control group.cgroup可以用于对一组进程分组,每一组进程就某种系统资源实现资源管理.cgroup即一组进程的行为控制.比如,我们限制进程/bin/sh的CPU使用为20%.我们就可以建一个cpu占用为20%的cgroup.然后将 /bin/sh进程添加到这个cgroup中.我们知道ulimit可以对系统资源进行限制,但ulimit以用户的资源为单位的,而cgroup可以针对到某个进程.我们也可以指定某个进程使用某个cpu.或者让某些进程使用一组CPU.cgroup包含了多个孤立的子系统,每一个子系统代表一个单一的资源,在新的内核中cgroup控制的模块有9个子系统,分别是:blkio 这个子系统设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb等等。cpu 这个子系统使用调度程序为cgroup任务提供cpu的访问。cpuacct 产生cgroup任务的cpu资源报告。cpuset 如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存。devices 允许或拒绝cgroup任务对设备的访问。freezer 暂停和恢复cgroup任务。memory 设置每个cgroup的内存限制以及产生内存资源报告。net_cls 标记每个网络包以供cgroup方便使用。ns 名称空间子系统。有RHEL6中,有libcgroup软件包,里面包含了cgroup的相关服务程序,而且cgroup在RHEL6中也做为服务出现.同时cpuset和cgroup也做为伪文件系统出现.如下:grep cpuset /proc/filesystemsnodev cpusetgrep cgroup /proc/filesystemsnodev cgroup2)我们可以通过cgroup中的cpuset子系统为进程指定CPU和内存.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论