1、0x00000004 (CPU2).如果想设置进程号(PID)为 12212 的进程到 CPU0 上的话:# taskset 0x00000001 -p 12212或者关掉任务(MySQL),并用taskset将它启动: # taskset -c 1,2,3 /etc/init.d/mysql start对于其他进程,也可如此处理(nginx除外,详见下文)。之后用top查看CPU的使用情况。二、配置nginx绑定CPU刚才说nginx除外,是因为nginx提供了更精确的控制。在conf/nginx.conf中,有如下一行: worker_processes 1;这是用来配置nginx启动几个
2、工作进程的,默认为1。而nginx还支持一个名为worker_cpu_affinity的配置项,也就是说,nginx可以为每个工作进程绑定CPU。我做了如下配置: worker_processes 3; worker_cpu_affinity 0010 0100 1000;这里0010 0100 1000是掩码,分别代表第2、3、4颗cpu核心。重启nginx后,3个工作进程就可以各自用各自的CPU了。三、代码中绑定1. 如果自己写代码,要把进程绑定到CPU,该怎么做?可以用sched_setaffinity函数。在Linux上,这会触发一次系统调用。int sched_setaffinity
3、(pid_t pid, unsigned int len, unsigned long *mask);sched_setaffinity 的第一个参数是pid (进程ID),设置进程为pid的这个进程,让它运行在mask所设定的CPU上。如果pid的值为0,则表示指定的是当前进程,使当前进程运行在mask所设定的那些CPU上;第二个参数cpusetsize是mask所指定的数的长度。通常设定为sizeof(cpu_set_t);如果当前pid所指定的CPU此时没有运行在mask所指定的任意一个CPU上,则该指定的进程会从其它CPU上迁移到mask的指定的一个CPU上运行。int sched_g
4、etaffinity(pid_t pid, unsigned int len, unsigned long *mask);该函数获得pid所指示的进程的CPU位掩码,并将该掩码返回到mask所指向的结构中,即获得指定pid当前可以运行在哪些CPU上。同样,如果pid的值为0.也表示的是当前进程。Example:1. /* Short test program to test sched_setaffinity2. * (which sets the affinity of processes to processors).3. * Compile: gcc sched_setaffinity_
5、test.c 4. * -o sched_setaffinity_test -lm5. * Usage: ./sched_setaffinity_test6. *7. * Open a top-window at the same time and see all the work8. * being done on CPU 0 first and after a short wait on CPU 1.9. * Repeat with different numbers to make sure, it is not a10. * coincidence.11. */12. 13. #inc
6、lude 14. #include 15. #include 16. 17. double waste_time(long n)18. 19. double res = 0;20. long i = 0;21. while(i n * 200000) 22. i+;23. res += sqrt (i);24. 25. return res;26. 27. 28. int main(int argc, char *argv)29. 30. unsigned long mask = 1; /* processor 0 */31. 32. /* bind process to processor
7、0 */33. if (sched_setaffinity(0, sizeof(mask), &mask) 21. while (i 23. res += sqrt(i);28. void *thread_func(void *param)33. if (pthread_setaffinity_np(pthread_self(), sizeof(mask), 34. &35. perror(pthread_setaffinity_np36. 37. 38. /* waste some time so the work is visible with 39. printf(, waste_tim
8、e(2000);40. 41. mask = 2;42. if (pthread_setaffinity_np(pthread_self(), sizeof(mask), 43. &44. perror(45. 46. 47. /* waste some more time to see the processor switch */48. printf(49. 50. 51. int main(int argc, char *argv)52. 53. pthread_t my_thread;54. 55. if (pthread_create(&my_thread, NULL, thread
9、_func, 56. NULL) != 0) 57. perror(pthread_create58. 59. pthread_exit(NULL);60. void CPU_ZERO (cpu_set_t *set)这个宏对 CPU 集 set 进行初始化,将其设置为空集。void CPU_SET (int cpu, cpu_set_t *set)这个宏将 cpu 加入 CPU 集 set 中。void CPU_CLR (int cpu, cpu_set_t *set)这个宏将 cpu 从 CPU 集 set 中删除。int CPU_ISSET (int cpu, const cpu_set_t *set)如果 cpu 是 CPU 集 set 的一员,这个宏就返回一个非零值(true),否则就返回零(false)。#include#include
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1