1. 如何手动分配CPU负载,让某些程序独占50%的CPU运算能力。
任务管理器---你选择的程序进程右键,可以自己强行分配CPU的,打钩就成了。
2. linux 调整CPU程序调度的几种方法
一,使用taskset充分利用多核cpu,让cpu的使用率均衡到每个cpu上
#taskset
-p, 设定一个已存在的pid,而不是重新开启一个新任务
-c, 指定一个处理,可以指定多个,以逗号分隔,也可指定范围,如:2,4,5,6-8。
1,切换某个进程到指定的cpu上
taskset -cp 3 13290
2,让某程序运行在指定的cpu上
taskset -c 1,2,4-7 tar jcf test.tar.gz test
需要注意的是,taskset -cp 3 13290在设定一个已经存在的pid时,子进程并不会继承父进程的,
因此像tar zcf xxx.tar.gz xxx这样的命令,最好在启动时指定cpu,如果在已经启动的情况下,则需要指定tar调用的gzip进程。
二,使用nice和renice设置程序执行的优先级
格式:nice [-n 数值] 命令
nice 指令可以改变程序执行的优先权等级。指令让使用者在执行程序时,指定一个优先等级,称之为 nice 值。
这个数值从最高优先级的-20到最低优先级的19。负数值只有 root 才有权力使。
一般使用者,也可使用 nice 指令来做执行程序的优先级管理,但只能将nice值越调越高。
可以通过二种方式来给某个程序设定nice值:
1,开始执行程序时给定一个nice值,用nice命令
2,调整某个运行中程序的PID的nice值,用renice命令
通常通过调高nice值来备份,为的是不占用非常多的系统资源。
例:
nice -n 10 tar zcf test.tar.gz test
由nice启动的程序,其子进程会继承父进程的nice值。
查看nice值
# nice -n -6 vim test.txt &
# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 19427 2637 0 75 0 – 16551 wait pts/6 00:00:00 bash
4 T 0 21654 19427 0 71 -6 – 23464 finish pts/6 00:00:00 vim
renice调整运行中程序的nice值
格式:renice [nice值] PID
三,使用ulimit限制cpu占用时间
注意,ulimit 限制的是当前shell进程以及其派生的子进程。因此可以在脚本中调用ulimit来限制cpu使用时间。
例如,限制tar的cpu占用时间,单位秒。
# cat limit_cpu.sh
ulimit -SHt 100
tar test.tar.gz test
如果tar占用时间超过了100秒,tar将会退出,这可能会导致打包不完全,因此不推荐使用ulimit对cpu占用时间进行限制。
另外,通过修改系统的/etc/security/limits配置文件,可以针对用户进行限制。
四,使用程序自带的对cpu使用调整的功能
某些程序自带了对cpu使用调整的功能,比如nginx服务器,通过其配置文件,可以为工作进程指定cpu,如下:
worker_processes 3;
worker_cpu_affinity 0001 0010 0100 1000;
这里0001 0010 0100 1000是掩码,分别代表第1、2、3、4颗cpu核心,这就使得cpu的使用比较平均到每个核心上。
3. linux单进程如何实现多核cpu多线程分配
linux下的单进程多线程的程序,要实现每个线程平均分配到多核cpu,主要有2个方法
1:利用linux系统自己的线程切换机制,linux有一个服务叫做irqbalance,这个服务是linux系统自带的,默认会启动,这个服务的作用就是把多线程平均分配到CPU的每个核上面,只要这个服务不停止,多线程分配就可以自己实现。但是要注意,如果线程函数内部的有某个循环,且该循环内没有任何系统调用的话,可能会导致这个线程的CPU时间无法被切换出去。也就是占满CPU现象,此时加个系统调用,例如sleep,线程所占的CPU时间就可以切换出去了。
2:利用pthread库自带的线程亲和性设置函数,来设置线程在某个CPU核心上跑,这个需要在程序内部实现。同时注意不要和进程亲和性设置搞混淆了
intpthread_setaffinity_np(pthread_tthread,size_tcpusetsize,
constcpu_set_t*cpuset);
intpthread_getaffinity_np(pthread_tthread,size_tcpusetsize,
cpu_set_t*cpuset);
从函数名以及参数名都很明了,唯一需要点解释下的可能就是cpu_set_t这个结构体了。这个结构体的理解类似于select中的fd_set,可以理解为cpu集,也是通过约定好的宏来进行清除、设置以及判断:
//初始化,设为空
voidCPU_ZERO(cpu_set_t*set);
//将某个cpu加入cpu集中
voidCPU_SET(intcpu,cpu_set_t*set);
//将某个cpu从cpu集中移出
voidCPU_CLR(intcpu,cpu_set_t*set);
//判断某个cpu是否已在cpu集中设置了
intCPU_ISSET(intcpu,constcpu_set_t*set);