linux多核并行命令,linux多核调度

Linux里面uptime命令作用是什么?

[root@oldboy ~]# uptime

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册网站空间、营销软件、网站建设、天台网站维护、网站推广。

11:45:25 up 5 days, 13:20, 3 users, load average: 0.00, 0.01, 0.05

uptime内容显示的内容一次是系统时间,开机到现在的天数,用户登录数,以及平均负载。

核心是平均负载,其实就是【单位时间内的活跃进程数】。

2颗,单颗4核CPU为例:

1分钟:10.00 #CPU处理进程1分钟的繁忙程度,忙碌1分钟。

5分钟:8.01 #CPU处理进程5分钟的繁忙程度,忙碌了5分钟

15分钟:5.05 #CPU处理进程15分钟的繁忙程度,忙碌持续15分钟,15分钟内平均值5.

uptime:故障恢复了。

1分钟:1.00 #CPU处理进程1分钟的繁忙程度,忙碌1分钟。

5分钟:8.01 #CPU处理进程5分钟的繁忙程度,忙碌了5分钟

15分钟:5.05 #CPU处理进程15分钟的繁忙程度,忙碌持续15分钟,15分钟内平均值5.

==============================================

总结:15分钟负载值12,是高是低呢

负载数值/总的核心数=1 #开始慢的临界点,实际上1*70%==关注的临界点。

12/8=1.2 大于1就说明有问题。

负载不要超过5,是临界点。

2颗单颗4核CPU,共8核,负载就是8*70%=5左右。

需要关注负载的值:总的核心数*70%=关注的点

==================要掌握的============================

1.平均负载是运行队列中活跃的进程数。

2.平均负载,1,5,15分钟内的负载。

3.需要关注负载的值:总的核心数*70%=关注的点

4.辅助top,ps,uptime,sar,mpstat,pidstat,iostat,排查问题。

5.strace跟踪进程系统调用。

6.记住几个案例(面试讲故事)。

面试官问:

你在工作中遇到过哪些生产故障,是怎么解决的?

最好和数据库相关(负载高),和web相关(PHP进程100%,JAVA内存泄漏)

==================要掌握的============================

***6.平均负载案例分析实战\***

下面,我们以三个示例分别来看这三种情况,并用 stress、mpstat、pidstat 等工具,找出平均负载升高的根源。

stress 是 Linux 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。

mpstat 是多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标。

pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。

#如果出现无法使用mpstat、pidstat命令查看%wait指标建议更新下软件包

yum install sysstats -y

yum install stress -y

stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s

***场景一:CPU 密集型进程\***

1.首先,我们在第一个终端运行 stress 命令,模拟一个 CPU 使用率 100% 的场景:

[root@oldboy ~]# stress --cpu 1 --timeout 600

2.接着,在第二个终端运行 uptime 查看平均负载的变化情况

# 使用watch -d 参数表示高亮显示变化的区域(注意负载会持续升高)

[root@oldboy ~]# watch -d uptime

*3.最后,在第三个终端运行 mpstat 查看 CPU 使用率的变化情况*

# -P ALL 表示监控所有CPU,后面数字5 表示间隔5秒后输出一组数据

[root@oldboy ~]# mpstat -P ALL 5

#单核CPU,所以只有一个all和0

4.从终端二中可以看到,1 分钟的平均负载会慢慢增加到 1.00,而从终端三中还可以看到,正好有一个 CPU 的使用率为 100%,但它的 iowait 只有 0。这说明,平均负载的升高正是由于 CPU 使用率为 100% 。那么,到底是哪个进程导致了 CPU 使用率为 100% 呢?可以使用 pidstat 来查询

![](18.Linux系统管理-进程管理.assets/a.png)

# 间隔5秒输出一组数据

[root@oldboy ~]# pidstat -u 5 1

#从这里可以明显看到,stress进程的CPU使用率为100%。

- 模拟cpu负载高 `stress --cpu 1 --timeout 100`

- 通过uptime或w 查看 `watch -d uptime`

- 查看整体状态mpstat -P ALL 1 查看每个cpu核心使用率

- 精确到进程: pidstat 1

****场景二:I/O 密集型进程\****

1.首先还是运行 stress 命令,但这次模拟 I/O 压力,即不停地执行 sync

[root@oldboy ~]# stress --io 1 --timeout 600s #利用sync()

stress --hdd 8 --hdd-bytes 1g # hd harkdisk 创建进程去进程写

*2.然后在第二个终端运行 uptime 查看平均负载的变化情况:*

[root@oldboy ~]# watch -d uptime

18:43:51 up 2 days, 4:27, 3 users, load average: 1.12, 0.65, 0.00

*3.最后第三个终端运行 mpstat 查看 CPU 使用率的变化情况:*

# 显示所有 CPU 的指标,并在间隔 5 秒输出一组数据

[root@oldboy ~]# mpstat -P ALL 5

#会发现cpu的与内核打交道的sys占用非常高

*4.那么到底是哪个进程,导致 iowait 这么高呢?我们还是用 pidstat 来查询*

# 间隔5秒后输出一组数据,-u 表示CPU指标

[root@oldboy ~]# pidstat -u 5 1

#可以发现,还是 stress 进程导致的。

- 通过stress 模拟大量进程读写 `stress --hdd 4 `

- 通过w/uptime查看系统负载信息 `watch -d uptime`

- 通过top/mpstat 排查 `mpstat -P ALL 1 或 top 按1`

- 确定是iowati `iostat 1查看整体磁盘读写情况 或iotop -o 查看具体哪个进程读写`

- 根据对应的进程,进行相关处理.

***场景三:大量进程的场景 高并发场景 \***

*当系统中运行进程超出 CPU 运行能力时,就会出现等待 CPU 的进程。*

*1.首先,我们还是使用 stress,但这次模拟的是 4 个进程*

[root@oldboy ~]# stress -c 4 --timeout 600

*2.由于系统只有 1 个 CPU,明显比 4 个进程要少得多,因而,系统的 CPU 处于严重过载状态*

*3.然后,再运行 pidstat 来看一下进程的情况:*

# 间隔5秒后输出一组数据

[root@oldboy ~]# pidstat -u 5 1

*可以看出,4 个进程在争抢 1 个 CPU,每个进程等待 CPU 的时间(也就是代码块中的 %wait 列)高达 75%。这些超出 CPU 计算能力的进程,最终导致 CPU 过载。*

****分析完这三个案例,我再来归纳一下平均负载与CPU\****

***平均负载提供了一个快速查看系统整体性能的手段,反映了整体的负载情况。但只看平均负载本身,我们并不能直接发现,到底是哪里出现了瓶颈。所以,在理解平均负载时,也要注意:

平均负载高有可能是 CPU 密集型进程导致的;

平均负载高并不一定代表 CPU 使用率高,还有可能是 I/O 更繁忙了;

当发现负载高的时候,你可以使用 mpstat、pidstat 等工具,辅助分析负载的来源****

**系统负载的计算和意义**

进程以及子进程和线程产生的计算指令都会让cpu执行,产生请求的这些进程组成"运行队列",等待cpu执行,这个队列就是系统负载, 系统负载是所有cpu的运行队列的总和.

[root@oldboyedu ~]# w

20:25:48 up 95 days, 9:06, 1 user, load average: 2.92, 0.00, 0.00

//假设当前计算机有4个核心的cpu,当前的负载是2.92

cpu1 cpu2 cpu3 cpu4

2.94/4(个cpu核心) = 73%的cpu资源被使用,剩下27%的cpu计算资源是空想的

//假设当前的计算有2个核心的cpu,当前的负载是2.92

2.92/2 = 146% 已经验证超过了cpu的处理能力

7. 日常故障排查流程(含日志)

- w/uptime, 查看负载

- ps aux/top 看看 cpu百分比, io wait或者是内存占用的高? (三高 cpu,io,内存)

- top检查具体是哪个进程,找出可疑进程

- 追踪这个进程使用情况,做什么的?

- 看看对应**日志**是否有异常

- 系统日志: /var/log/messages(系统通用日志) /var/log/secure(用户登录情况)

- 服务软件的日志

***3.那平均负载为多少时合理\***

*最理想的状态是每个 CPU核心 上都刚好运行着一个进程,这样每个 CPU 都得到了充分利用。所以在评判平均负载时,首先你要知道系统有几个 CPU核心,这可以通过 top 命令获取,或`grep 'model name' /proc/cpuinfo`*

系统平均负载被定义为在特定时间间隔内运行队列中的平均进程数。如果一个进程满足以下条件则其就会位于运行队列中:

- 它没有在等待I/O操作的结果

- 它没有主动进入等待状态(也就是没有调用'wait')

- 没有被停止(例如:等待终止)

《内容来自老男孩老师的课堂笔记》

linux查看硬件命令有哪些

你们知道怎么查看Linux中的硬件吗,命令是什么?下面是我带来的关于linux查看硬件命令有哪些的内容,欢迎阅读!

Linux查看硬件命令一:

linux如何查看系统的硬件配置

如何在linux系统下查看系统配置? 在图形模式下我们可以很方便的利用Linux的图形工具,点击几下就可以查看到Linux系统的的硬件信息。但是大部分生产服务器系统为了节约系统资源是没有安装Xwindo服务的。所以我们在图形模式下掌握查看系统硬件信息的方式是很

如何在linux系统下查看系统配置?

在图形模式下我们可以很方便的利用Linux的图形工具,点击几下就可以查看到Linux系统的的硬件信息。但是大部分生产服务器系统为了节约系统资源是没有安装Xwindo服务的。所以我们在图形模式下掌握查看系统硬件信息的方式是很必要的。

linux下至今 没有给出机器系统信息的命令或者是软件(类似CPU—Z,everest等)。 要想查看系统的配置 具体的 方法 是:

1、系统硬件配置都在/proc 目录里面

2、可以用命令查看里面的文件即可 比如:

cat /proc/ cpu info 查看cpu信息,processor 0 为一个U, 1为两个,flags超线程。

lspci 查看主板信息

free –m 查内存 (total属性下显示的是内存的大小)。

fidsk -l 查硬盘空间

df -h 查硬盘

du -sh 查看文件夹大小

top 这个比较全,内存 进程 负载 都有了。

uptime 查运行时间 负载情况 等等的信息

Linux查看硬件命令二:

1,在linux下,有多种命令可以用于查看硬件信息:

用硬件检测程序kuduz探测新硬件:service kudzu start ( or restart);

查看CPU信息:cat /proc/cpuinfo;

查看板卡信息:cat /proc/pci;

查看PCI信息:lspci (相比cat /proc/pci更直观);

查看内存信息:cat /proc/meminfo;

查看USB设备:cat /proc/bus/usb/devices;

查看键盘和鼠标:cat /proc/bus/input/devices;

查看系统硬盘信息和使用情况:fdisk disk – l df;

查看各设备的中断请求(IRQ):cat /proc/interrupts;

查看启动硬件检测信息日志:dmesg more /var/log/dmesg。

2,几种查看Linux版本信息的方法:

uname -a;

cat /proc/version;

cat /etc/issue;

lsb_release -a;

cat /etc/redhat-release;

rpm -q redhat-release。

看了"linux查看硬件命令有哪些" 文章 内容的人还看:

1. linux中查看硬件信息的方法有哪些

2. LINUX操作系统常用命令有哪些

3. linux操作系统版本查看命令

4. Linux top命令查看多核CPU每个核心的使用率

5. Linux中查看CPU的信息的方法是什么

6. Linux使用dmidecode命令查看内存型号

7. 如何正确查看Linux机器内存使用情况

8. Linux系统查看当前时间的命令

9. Linux常用命令

10. 必学100个常用linux命令大全

arm linux 多核同时运行

多处理器可以被定义用来包含多个core的单个设备中同时运行二个或多个指令。现在广泛应用于通用应用处理器和嵌入式系统中。

C++ openmp并行程序在多核linux上如何最大化使用cpu

openmp并行程序在多核linux上最大化使用cpu的方法如下:

#include stdio.h

#include stdlib.h

#include omp.h

#include time.h

int main()

{

long long i;

long double sum = .0;

long double sec = .0;

// Multi-thread compute start

clock_t t1 = clock();

#pragma omp parallel for

for (i = 0; i  1000000000; i++)

{

sum += i/100;

}

clock_t t2 = clock();

sec = (t2 - t1);

//sec = (t2 - t1);

printf("Program costs %.2Lf clock tick.\n", sec);

exit(EXIT_SUCCESS);

}

以上代码中,#pragma omp parallel for

这一行的作用即是调用openmp的功能,根据检测到的CPU核心数目,将for (i = 0; i 1000000000; i++)这个循环执行过程平均分配给每一个CPU核心。

去掉#pragma omp parallel for这行,则和普通的串行代码效果一致。

注意,要使用openmp功能,在编译的时候需要加上-fopenmp编译参数。

以下是两种编译搭配两种代码出现的4种结果,可以很直观地看到效果:

1、代码里含有#pragma omp parallel for,编译参数有-fopenmp

Endys-MacBook-Pro:Desktop endy$ vi test.c

Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test -fopenmp

Endys-MacBook-Pro:Desktop endy$ ./test

Program costs 50202611.00 clock tick.

2、代码里含有#pragma omp parallel for,编译参数没有-fopenmp

Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test

Endys-MacBook-Pro:Desktop endy$ ./test

Program costs 4068178.00 clock tick.

3、代码里没有#pragma omp parallel for,编译参数有-fopenmp

Endys-MacBook-Pro:Desktop endy$ vi test.c

Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test -fopenmp

Endys-MacBook-Pro:Desktop endy$ ./test

Program costs 4090744.00 clock tick.

4、代码里没有#pragma omp parallel for,编译参数没有-fopenmp

Endys-MacBook-Pro:Desktop endy$ vi test.c

Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test

Endys-MacBook-Pro:Desktop endy$ ./test

Program costs 4170093.00 clock tick.

可以看出,只有在情况1下,openmp生效,其他3种情况下,均为单核运行,2、3、4结果较为接近,而1的运行结果大约相差25%。

值得注意的是,使用多核心的case 1竟然比单核的其他3种case慢了25%,原因是在这种单一的循环运算中,并行分配CPU任务的指令比直接执行下一个循环指令的效率更低。所以并不是用并行运算就一定能够提高运算效率的,要根据实际情况来判断。

linux单进程如何实现多核cpu多线程分配?

linux下的单进程多线程的程序,要实现每个线程平均分配到多核cpu,主要有2个方法

1:利用linux系统自己的线程切换机制,linux有一个服务叫做irqbalance,这个服务是linux系统自带的,默认会启动,这个服务的作用就是把多线程平均分配到CPU的每个核上面,只要这个服务不停止,多线程分配就可以自己实现。但是要注意,如果线程函数内部的有某个循环,且该循环内没有任何系统调用的话,可能会导致这个线程的CPU时间无法被切换出去。也就是占满CPU现象,此时加个系统调用,例如sleep,线程所占的CPU时间就可以切换出去了。

2:利用pthread库自带的线程亲和性设置函数,来设置线程在某个CPU核心上跑,这个需要在程序内部实现。同时注意不要和进程亲和性设置搞混淆了

int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,

const cpu_set_t *cpuset);

int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, 

cpu_set_t *cpuset);

从函数名以及参数名都很明了,唯一需要点解释下的可能就是cpu_set_t这个结构体了。这个结构体的理解类似于select中的fd_set,可以理解为cpu集,也是通过约定好的宏来进行清除、设置以及判断:

//初始化,设为空

void CPU_ZERO (cpu_set_t *set); 

//将某个cpu加入cpu集中 

void CPU_SET (int cpu, cpu_set_t *set); 

//将某个cpu从cpu集中移出 

void CPU_CLR (int cpu, cpu_set_t *set); 

//判断某个cpu是否已在cpu集中设置了 

int CPU_ISSET (int cpu, const cpu_set_t *set);


分享文章:linux多核并行命令,linux多核调度
URL标题:http://azwzsj.com/article/dsgsedi.html