使用top命令,具体用法是 top -H,加上这个选项,top的每一行就不是显示一个进程,而是一个线程。
创新互联2013年开创至今,先为蓝山等服务建站,蓝山等地企业,进行企业商务咨询服务。为蓝山企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
使用ps命令,具体用法是 ps -xH,这样可以查看所有存在的线程,也可以使用grep作进一步的过滤。
使用ps命令,具体用法是 ps -mq PID,这样可以看到指定的进程产生的线程数目。
更进一步,其实一些系统监控工具,在本质上也是读取的系统产生的文件罢了。
第一种:linux的shell命令行方式,命令名字为taskset。第二种就是代码实现级别的了,pthread_setaffinity_np和sched_setaffinity函数接口。
第一种方式我已经验证过了,确实可行。同时验证了我心中的疑问:如果将某个线程绑定到某个物理核上之后,在此线程运行结束前,会不会有别的线程被调度到此物理核上执行? 写了一个死循环验证了下,发现绑定之后是不会调度别的线程在此核上运行的!(肉眼观察的,时不时观察下,没发现别的线程在此核上执行;对比了下没有绑定的情况,会发现过段时间此线程就会被调度到别的核心上执行)
此种方式有个问题,就是只有线程运行起来后才会被绑定到某个核上,不够及时。
具体的方式为:
1.首先根据系统的差别运行如下安装命令:
sudo apt-get install util-linux (Debian,Ubuntu or Linux Mint)
sudo yum install util-linux (Fedora,CentOS or RHEL)
2.相关命令的使用:
2.1 使用命令 taskset -p PID 来获得此Process的 CPU affinity。
eg: taskset -p 2915 ------ pid 2915's current affinity mask:ff; ff=="1111 1111",没一个1代表一个核,共8个核,能用的核数也为8个核。
2.2 使用命令 taskset -cp PID 可获得数字形式的CPU affinity。
eg: taskset -cp 2915 ------ pid 2915's current affinity list: 0--7。
接下来为将进程pin到某个核上的命令;
2.3 taskset -p COREMASK PID
eg:taskset -p 0x11 9030 ------pid 9030's current affinity mask: ff , pid 9030's new affinity mask: 11 。意思就是将此进程绑定到了CPU core 0 and 4。
2.4 taskset -cp CORE-LIST PID
eg:taskset -cp 0,4 9030 ------the same as below.
With "-c" option, you can specify a list of numeric CPU core IDs separated by commas, or even include ranges (e.g., 0,2,5,6-10).
2.5 taskset COREMASK EXECUTABLE
eg: taskset 0x1 xxxx -----"xxxx" represented the name of one program.
另外:参考文章最后的位置说到,绑定到此物理核之后,别的进程(线程)还可以调度到此核上执行,但是没说绑定的这个线程没执行完之前是否会被别的线程挤掉。根据我的观察是不会被挤掉,这我在文章的开头也有提到。
绑定cpu方式:
c语言:
sched_setaffinity(0, sizeof(mask), mask)
shell命令:
在grup启动时传给内核参数: isolcpus=2-15, 这里表示隔离第3到16个CPU, Linux程序只跑在第一和第二个CPU上, 空闲的CPU我们可以指定跑进程了.
这是内核文档里对内核参数的解释:
isolcpus= [KNL,SMP] Isolate CPUs from the general scheduler.
Format:
cpu number,...,cpu number
or
cpu number-cpu number
(must be a positive range in ascending order)
or a mixture
cpu number,...,cpu number-cpu number
This option can be used to specify one or more CPUs
to isolate from the general SMP balancing and scheduling
algorithms. You can move a process onto or off an
"isolated" CPU via the CPU affinity syscalls or cpuset.
cpu number begins at 0 and the maximum value is
"number of CPUs in system - 1".
This option is the preferred way to isolate CPUs. The
alternative -- manually setting the CPU mask of all
tasks in the system -- can cause problems and
suboptimal load balancer performance.
linux nice 命令详解
功能说明:设置优先权。
语法:nice [-n 优先等级][--help][--version][执行指令]
补充说明:nice指令可以改变程序执行的优先权等级。
参数:-n优先等级或-优先等级或--adjustment=优先等级 设置欲执行的指令的优先权等级。等级的范围从-20-19,其中-20最高,19最低,只有系统管理者可以设置负数的等级。
--help 在线帮助。
--version 显示版本信息。
linux renice 命令详解
功能说明:调整优先权。
语法:renice [优先等级][-g 程序群组名称...][-p 程序识别码...][-u 用户名称...]
补充说明:renice指令可重新调整程序执行的优先权等级。预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权。等级范围从-20--19,只有系统管理者可以改变其他用户程序的优先权,也仅有系统管理者可以设置负数等级。
参数:
-g 程序群组名称 使用程序群组名称,修改所有隶属于该程序群组的程序的优先权。
-p 程序识别码 改变该程序的优先权等级,此参数为预设值。
-u 用户名称 指定用户名称,修改所有隶属于该用户的程序的优先权。
taskset设定cpu亲和力,cpu亲和力是指
CPU调度程序属性关联性是“锁定”一个进程,使他只能在一个或几个cpu线程上运行。对于一个给定的系统上设置的cpu。给定CPU亲和力和进程不会运行在任何其他CPU。注意,Linux调度器还支持自然CPU关联:(不能让这个cpu只为这一个进程服务)
这里要注意的是我们可以把某个程序限定在某一些CPU上运行,但这并不意味着该程序可以独占这些CPU,其实其他程序还是可以利用这些CPU运行。如果要精确控制CPU,taskset就略嫌不足,cpuset才是可以
-a, --all-tasks 操作所有的任务线程-p, --pid 操作已存在的pid-c, --cpu-list 通过列表显示方式设置CPU
(1)指定1和2号cpu运行25718线程的程序
taskset -cp 1,2 25718
(2),让某程序运行在指定的cpu上 taskset -c 1,2,4-7 tar jcf test.tar.gz test
(3)指定在1号CPU上后台执行指定的perl程序
taskset –c 1 nohup perl pi.pl