`
xiaoheliushuiya
  • 浏览: 404146 次
文章分类
社区版块
存档分类
最新评论

用taskset充分利用多核cpu

 
阅读更多

转自文章:http://www.cnblogs.com/edwardlost/archive/2010/10/23/1858991.html

转自文章:http://blog.sina.com.cn/s/blog_4d8a2c970100fu31.html

转自文章:http://hiadmin.com/?p=1452

转自文章:http://blog.163.com/digoal@126/blog/static/1638770402010411113717972/

利用taskset可以充分利用多核cpu的好处,可以让某个程序或脚本,运行在某个具体的cpu上。

这个工具系统可能没有默认安装:,rpm包名util-linux

#taskset --help
taskset (util-linux 2.13-pre7)
usage: taskset [options] [mask | cpu-list] [pid | cmd [args...]]
set or get the affinity of a process

-p, –pid operate on existing given pid
-c, –cpu-list display and specify cpus in list format
-h, –help display this help
-v, –version output version information

1:让某个程序运行在特定cpu上面

taskset -c 0 sh wade.sh

2:切换某个进程到特定的cpu上。

taskset -pc 0 12345

比如你有一个cpu是4 core你可以这样写你的脚本


#!/bin/bash

taskset -c 0 sh a.sh &

taskset -c 1 sh b.sh &

taskset -c 2 sh c.sh &

taskset -c 3 sh d.sh &

应该可以充分利用你的cpu了。


---------------------------------------------------------------------------------------

常常感觉系统资源不够用,一台机子上跑了不下3个比较重要的服务,但是每天我们还要在上面进行个备份压缩等处理,网络长时间传输,这在就很影响本就不够用的系统资源;

这个时候我们就可以把一些不太重要的比如copy/备份/同步等工作限定在一颗cpu上,或者是多核的cpu的一颗核心上进行处理,虽然这不一定是最有效的方法,但可以最大程度上利用了有效资源,降低那些不太重要的进程占用cpu资源;

查看系统下cpu信息:

#cat /proc/cpuinfo

taskset就可以帮我们完成这项工作,而且操作非常简单;

该工具系统默认安装,rpm包名util-linux

#taskset --help
taskset (util-linux 2.13-pre7)
usage: taskset [options] [mask | cpu-list] [pid | cmd [args...]]
set or get the affinity of a process

-p, –pid operate on existing given pid
-c, –cpu-list display and specify cpus in list format
-h, –help display this help
-v, –version output version information

举例:
1、开启一个只用0标记的cpu核心的新进程(job.sh是你的工作脚本)

#taskset -c 0 sh job.sh

2、查找现有的进程号,调整该进程cpu核心使用情况(23328举例用的进程号)

#taskset -pc 0 23328
pid 23328's current affinity list: 0-3 #0-3表示使用所有4核进行处理
pid 23328's new affinity list: 0 #调整后改为仅适用0标记单核处理

3、可在top中进行负载check

最后你可以在你的工作脚本中加入该指令来合理利用现有的cpu资源;

--------------------------------------------------------------------------------------------------------------

现在多核的CPU已经相当普遍了,那么这种多核的服务器如何让CPU得到充分利用,可以靠应用自己来定义,或者依赖操作系统来调度。根据红帽的说法RHEL5有一个很强壮的CPU调度机制,RHEL6就更强壮了,所以看起来跑在LINUX下面的应用应该都不用去管该用哪个CPU。

首先我们来看看CPU中断请求的统计:

CentOS release 5.2 (Final)

从图上看,CPU的使用基本上还是均匀的。不过CPU0负载还是最大的。

所有在某种情况下可能会需要手工来设置进程使用CPU核的优先级。

下面是一个操作的例子:

postgres 6457 1 0 May05 ? 00:00:00 /app/pgsql/bin/postgres -D /database/pgdata -p 1921

[root@develop1 ~]# taskset -pc 6457

pid 6457’s current affinity list: 0-3

这个进程目前是默认与0-3 这4个核心亲和的。也就是说会在0-3这几个核心调度。

[root@develop1 ~]# taskset -pc 0-1 6457

pid 6457’s current affinity list: 0-3

pid 6457’s new affinity list: 0,1

修改之后我们看到,已经修改为0,1的范围了。

可以通过top -p 6457 [f -> j]

查看P列可以看到当前运行的核心号。

如果该成在单个CORE上跑的话,马上就能看到CORE的变化。

------------------------------------------

我的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架构下,能够将一个或多个进程绑定到一个或多个处理器上运行。[更多...]


一、在Linux上修改进程的“CPU亲和力”

在Linux上,可以通过 taskset命令进行修改。以Ubuntu为例,运行如下命令可以安装taskset工具。

# apt-get install schedutils

对运行中的进程,文档上说可以用下面的命令,把CPU#1 #2 #3分配给PID为2345的进程:

# taskset -cp 1,2,3 2345

但我尝试没奏效,于是我关掉了MySQL,并用taskset将它启动:

# taskset -c 1,2,3 /etc/init.d/mysql start

对于其他进程,也可如此处理(nginx除外,详见下文)。之后用top查看CPU的使用情况,原来空闲的#1 #2 #3,已经在辛勤工作了。


二、配置nginx绑定CPU

刚才说nginx除外,是因为nginx提供了更精确的控制。

conf/nginx.conf中,有如下一行:

worker_processes 1;

这是用来配置nginx启动几个工作进程的,默认为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了。


三、刨根问底

如果自己写代码,要把进程绑定到CPU,该怎么做?可以用sched_setaffinity函数。在Linux上,这会触发一次系统调用。 如果父进程设置了affinity,之后其创建的子进程是否会有同样的属性?我发现子进程确实继承了父进程的affinity属性。


四、Windows?

在Windows上修改“CPU亲和力”,可以通过任务管理器搞定。

* 个人感觉,Windows系统中翻译的“处理器关系”比“CPU亲和力”容易理解点儿

—————–

进行了这样的修改后,即使系统负载达到3以上,不带缓存打开blogkid.net首页(有40多次查询)依然顺畅;以前一旦负载超过了1.5,响应就很慢了。效果很明显。

linux taskset命令详解

SYNOPSIS
taskset [options] [mask | list ] [pid | command [arg]...]
OPTIONS
-p, --pid
operate on an existing PID and not launch a new task
-c, --cpu-list
specifiy a numerical list of processors instead of a bitmask.
The list may contain multiple items, separated by comma, and
ranges. For example, 0,5,7,9-11.
-h, --help
display usage information and exit
-V, --version
output version information and exit


分享到:
评论

相关推荐

    0001-cgel_exclusive_taskset.patch

    基于Linux4.14.76内核的补丁

    psutil-2.0.0.tar.gz

    psutil 是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括 CPU、内存、磁盘、网络等)信息。它主要应用于系统监控,分析和限制系统资源及进程的管理。它实现...

    Python中psutil的介绍与用法

    psutil是一个跨平台库(http://pythonhosted.org/psutil/)能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要用来做系统监控,性能分析,进程管理。它实现了同等命令行工具提供...

    php-cpu-core-detector

    当前仅支持具有hash , nproc和taskset Linux。 执照 版权所有2016 特此免费授予获得该软件和相关文档文件(“软件”)副本的任何人无限制使用软件的权利,包括但不限于使用,复制,修改,合并的权利,发布,分发...

    python psutil模块使用方法解析

    psutil(进程和系统实用程序)是一个跨平台的库,用于 在Python中检索有关运行进程和系统利用率(CPU,内存,磁盘,网络,传感器)的信息。 它主要用于系统监视,分析和限制流程资源以及运行流程的管理。它实现了...

    Python系统监控模块psutil功能与经典用法分析

    psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要应用于系统监控,分析和限制系统资源及进程的管理。它实现了...

    详解Python3.6安装psutil模块和功能简介

    1. psutil是一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要应用于系统监控,分析和限制系统资源及进程的管理。它实现了同等命令行工具提供的功能,如ps、...

    python获取系统内存占用信息的实例方法

    psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要应用于系统监控,分析和限制系统资源及进程的管理。它实现了...

    java脚本时钟源码-clocks:测试各种时钟的代码

    (taskset 仅用于 C++ 测试——JVM 使用了如此多的线程,将它们全部固定到单个 CPU 可能不是一个好主意)。 您需要修改脚本以在系统上为 JAVA_HOME 指定正确的位置,或者在调用脚本之前设置 JAVA_HOME。 该脚本通过...

    psutil:一个跨平台进程和系统工具Python模块-python开发

    快速链接 主页 安装文档 下载 论坛 博客 开发指南 新增功能 摘要 psutil(进程和系统实用程序)是一个跨平台库,用于在 Python 中检索有关正在运行的进程和系统利用率(CPU、内存、磁盘、网络)的信息。 它主要用于...

    ZYNQ7000使用PL+PS实现网络功能的例程xapp1082

    ZYNQ7000使用PL+PS实现网络功能的例程, 对于使用PL实现网络功能,有非常大的参考作用

    MicroMachines:早期的虚拟机实验

    系统要求基础系统 --kvm --libvirt --python-libvirt --make --nasm 统计包--sysstat重建情节图 1 中的图是使用 sysstat 包创建的,如下所示: 构建机器: $ cp src/cpu_profile_n.asm microMachine.asm $ make 启动...

    使用上千个优化任务学习超参数搜索策略【Google 大脑】.pdf

    TaskSet在规模和多样性上都是独一无二的,它包含了超过1000个任务,从使用全连接或卷积神经网络的图像分类,到变分自编码器,再到各种数据集上的非卷保存流。作为此类数据集的一个示例应用程序,我们将探索元学习一...

    SOTA-models:最先进的深度神经网络模型

    最先进的 (SOTA) 模型用于前馈速度分析的 SOTA 深度神经网络模型库运行代码 th ...在特定核心上运行笔记使用sudo taskset -c 4-7 th ...修复 8 个内核、4 个慢速和 4 个快速、缓慢的性能sudo taskset -c 4-7 th ...

    spark源码分析.pdf

    spark源码分析,RDD、Iterator、Job、DAG、Stage、Taskset、task等

    Python 3.6 性能测试框架Locust安装及使用方法(详解)

    背景 Python3.6 性能测试框架Locust的搭建与使用 基础 python版本:python3.6 开发工具:pycharm Locust的安装与配置 ... ...安装完成即可使用。...from locust import Locust, TaskSet, task class UserB

    gearman-ruby:官方! 用于Gearman分布式作业系统的Ruby库

    Gearman-ruby 这是什么? 这是用于分布式作业系统的纯Ruby库。...taskset = Gearman :: TaskSet . new ( client ) task = Gearman :: Task . new ( 'sleep' , 20 ) task . on_complete { | d | puts d } tas

    moco.tensorflow:动量对比度(MoCo)的TensorFlow重新实现

    taskset命令(来自util-linux包) 无监督培训: 要在具有8个GPU的计算机上运行MoCo预培训,请使用: horovodrun -np 8 --output-filename moco.log python main_moco.py --data /path/to/imagenet 添加--v2来训练...

    Locust 执行顺序和任务集嵌套

    TaskSequence 类是一个 TaskSet,但其任务将按顺序执行。要定义顺序,使用 @seq_task 装饰器。 @seq_task 被用作一个便利的装饰器,能够为一个内嵌的 TaskSequence 声明任务。 描述的并不清晰。 实践中发现,要...

Global site tag (gtag.js) - Google Analytics