优化命令之taskset——查询或设置进程绑定CPU

打印 上一主题 下一主题

主题 635|帖子 635|积分 1905

目次
一:taskset概述
二:安装taskset工具
2.1taskset语法
2.2taskset用法
2.2.1指定PID为8528的进程在CPU1上运行
2.2.2更改具体某一进程(或 线程)CPU亲和性
2.2.3 查看具体某一进程(或 线程)的处理器亲和性(掩码)
2.2.4为具体某一进程(或 线程)CPU亲和性指定一组范围
三:依托nginx进行验证
四:总结 

一:taskset概述

我的 Linode非常繁忙,在跑一些麋集操作数据库的Rake使命时尤其如此。但我观察发现,Linode服务器的4核CPU,只有第1个核心(CPU#0)非常忙,其他都处于idle状态
不相识Linux是怎样调度的,但目前显然有优化的余地。除了处理正常使命,CPU#0还必要处理每秒网卡中断。因此,若能将CPU#0分担的使命摊派到其他CPU核心上,可以预见,体系的处理能力将有更大的提升
相识俩个名词:
SMP (Symmetrical Multi-Processing):指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子体系以及总线结构

CPU affinity:中文唤作“CPU亲和力”,是指在CMP架构下,能够将一个或多个进程绑定到一个或多个处理器上运行
二:安装taskset工具

  1. yum install util-linux -y
复制代码

调整进程优先权和利用taskset有效控制cpu资源
taskset 查询或设置进程(线程)绑定CPU(亲和性)
通过 taskset 命令可将某个进程与某个CPU核心绑定,使得其仅在与之绑定的CPU核心上运行。

线程是最小的内核执行调度单元,因此,准确地说是将某个线程与某个CPU核心绑定,而非某个进程。
taskset 是依据 线程PID(TID)查询或设置线程的CPU亲和性(与哪个CPU核心绑定)

2.1taskset语法

  1. taskset [options]   mask command [arg]...
  2. taskset [options]   -p [mask] pid
复制代码
常用参数:
  1. -a, --all-tasks 操作所有的任务线程
  2. -p, --pid 操作已存在的pid
  3. -c, --cpu-list 通过列表显示方式设置CPU(逗号相隔)
  4. -V, --version           输出版本信息
复制代码

2.2taskset用法

  1. cat /proc/cpuinfo | grep processor
  2. 查看主机有几个核
复制代码

默认情况下,进程可以运行在任意的CPU核心上(0-3)
2.2.1指定PID为8528的进程在CPU1上运行

  1. taskset -pc 1 6550     查看进程(或 线程)允许允许CPU范围使用-c参数
  2. pid 6550's current affinity list: 0-3
  3. ###Pid 6550的当前关联列表:0-3
  4. pid 6550's new affinity list: 1
  5. ###id 6550的新关联列
复制代码

2.2.2更改具体某一进程(或 线程)CPU亲和性

  1. taskset  -p   hexadecimal mask  PID/LWP
  2. 上面号线程可以在0~3号CPU之间允许,现在设置掩码0x11(二进制0001 0001),表示可以在0~3号CPU上允许
复制代码

2.2.3 查看具体某一进程(或 线程)的处理器亲和性(掩码)

  1. 查询PID(TID)= 8473 的进程可用的CPU核心,掩码形式表示
  2. taskset -p 8473
  3. 查询 PID(TID)= 8473 的进程可用的CPU核心
  4. taskset -pc 8473
复制代码

mask是16进制   f代表15  转为2进制就是1111
0x0F(十六进制) => 1111(二进制),最右起第一个1表示CPU核心#0,第二个1表示CPU核心#1…设置 PID(TID)= 10878 的线程可用的CPU核心到#0、#2上
只要taskset成功返回了,那就表示绑核一定成功了,即该进程已被绑到指定的核上面,而且taskset命令会显示原来的绑核(原来的大概是体系默认分配的核)情况,以及新的绑核情况
2.2.4为具体某一进程(或 线程)CPU亲和性指定一组范围

  1. taskset -cp 1,2 8473   使用-c参数
复制代码

三:依托nginx进行验证

将nginx 绑定CPU
安装nginx 服务
  1. 1、安装依赖包
  2. yum -y install pcre-devel zlib-devel gcc gcc-c++ make
  3. 2、创建运行用户
  4. useradd -M -s /sbin/nologin nginx
  5. 3、编译安装
  6. cd /opt
  7. tar zxvf nginx-1.12.0.tar.gz -C /opt/''.6hvcf
  8. cd nginx-1.12.0/
  9. ./configure \
  10. --prefix=/usr/local/nginx \
  11. --user=nginx \
  12. --group=nginx \
  13. --with-http_stub_status_module
  14. make && make install
  15. 4、优化路径
  16. ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
  17. 5、添加 Nginx 系统服务
  18. vim /lib/systemd/system/nginx.service
  19. [Unit]
  20. Description=nginx
  21. After=network.target
  22. [Service]
  23. Type=forking
  24. PIDFile=/usr/local/nginx/logs/nginx.pid
  25. ExecStart=/usr/local/nginx/sbin/nginx
  26. ExecReload=/bin/kill -s HUP $MAINPID
  27. ExecStop=/bin/kill -s QUIT $MAINPID
  28. PrivateTmp=true
  29. [Install]
  30. WantedBy=multi-user.target
  31. chmod 754 /lib/systemd/system/nginx.service
  32. systemctl start nginx.service
  33. systemctl enable nginx.service
复制代码
  1. vim /usr/local/nginx/conf/nginx.conf
复制代码
使用nginx,是因为nginx提供了更精确的控制。
在conf/nginx.conf中,有如下一行:
worker_processes  1;

这是用来配置nginx启动几个工作进程的,默认为1。而nginx还支持一个名为worker_cpu_affinity的配置项,也就是说,nginx可以为每个工作进程绑定CPU

查询 nginx 的  pid
  1. ps -C nginx -o pid
复制代码

未重启nginx
 
重启nginx
4个服务各自在不同的cpu上运行

修改回来服务在cpu上随机运行
 
 
四:总结 

taskset 查询或设置进程(线程)绑定CPU(亲和性)
通过 taskset 命令可将某个进程与某个CPU核心绑定,使得其仅在与之绑定的CPU核心上运行
线程是最小的内核执行调度单元,因此,准确地说是将某个线程与某个CPU核心绑定,而非某个进程。
taskset 是依据 线程PID(TID)查询或设置线程的CPU亲和性(与哪个CPU核心绑定)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

八卦阵

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表