为Linux服务器设置CPU亲和力

前言:何为性能优化?

为什么要性能优化?为了提高应用程序或系统能力为目的。

如何才能实现对应应用程序的性能调优?

- 包括Linux内核、CPU架构以及Linux内核资源的分配以及管理。

 

常用术语:

延迟:延迟是描述操作之后用来等待返回结果的时间。在某些情况下,他可以指整个操作时间,等同于响应时间。

IOPS:每秒发生的输入/输出操作的次数,是数据传输的一个度量方法。对于磁盘的读写,IOPS指的是每秒读写的次数。

响应时间:一般操作完成的时间。包括等于等待和服务时间,也包括用来返回结果的时间。

使用率:对于服务所请求的资源,使用率描述在所给定时间内资源的繁忙程度。对于存储资源来说,使用率指的就是所消耗的存储容量。

饱和度:指的就是某一资源无法满足服务的排队工作量。

吞吐量:评论工作持续的速率,尤其是在数据传输方面,这个属于用于数据传输速度(字节/妙和比特/妙)。在某些情况下,吞吐量指的是操作速度。

 

Linux内核功能:

CPU调度级别:各种先进的CPU调度算法,非一直存储访问架构(NUMA);

I/O调度级别:I/O调度算法,包括deadline/anticipatory和完全公平队列(CFQ);

TCP网络阻塞:TCP拥堵算法,允许按需选择;

 

常见问题:

进程、线程和任务之间的区别

进程通常定义为程序的执行。用以执行用户级别程序的环境包括:内存地址空间、文件描述符、线程栈和寄存器;

线程是某一进程中单独运行的程序。也就是说线程在进程之中;

任务是程序完成的某一活动,可以是一个进程,也可以是一个线程;

 

上下文切换

执行一段程序代码,实现一个功能的过程介绍,当得到CPU的时候,相关的资源必须也已经就位,就是显卡、内存、GPS等,然后CPU开始执行。这里除了CPU以外所有的就构成了这个程序的执行环境,也就是我们所定义的程序上下文。当这个程序执行完或者分配给他的CPU执行时间用完了,那它就要被切换出去,等待下一次CPU的临幸。在被切换出去的最后一步工作就是保存程序上下文,因为这个是下次他被CPU临幸的运行环境,必须保存。

 

I/O密集型和CPU密集型工作负载之间的区别

I/O密集型指的是系统的CPU耗能相对硬盘/内存的耗能能要好很多,此时,系统运作,大部分的状况是 CPU 在等I/O(硬盘/内存)的读/写,此时CPU负载不高。CPU密集型指的是系统的硬盘/内存耗能相对CPU的耗能要好很多,此时,系统运作,大部分的状况是 CPU负载 100%,CPU 要读/写 I/O (硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU负载很高。一般而言CPU占用率相当高,大部份时间用来做计算、逻辑判断等CPU动作的程序;

 

查看进程树

[查看全部进程树]# pstree -p

[安装查看进程树命令]# yum -y install psmisc > /dev/null

[检索nginx的进程树]# pstree -p | grep nginx

           |-nginx(8700)-+-nginx(8922)

           |             |-nginx(8923)

           |             |-nginx(8924)

           |             `-nginx(8925)

·pstree --Processes Tree 命令格式:pstree [选项] [PID或用户名]

·常用命令选项  -a :显示完整的命令行;  -p :列出对应PID编号;

 

查看进程快照

[列出正在运行的所有进程]# ps aux

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root         1  0.0  0.0 193636  6688 ?        Ss   9月26   0:13 /usr/lib/systemd/systemd --sw

……

[列出正在运行的所有进程]# ps -elf

F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD

4 S root         1     0  0  80   0 - 48409 ep_pol 9月26 ?       00:00:13 /usr/lib/systemd/sys

……

 

·ps -- Processes Snapshot  命令格式:ps [选项]...

常用命令选项  aux :显示当前终端所有进程(a)、当前用户在所有终端下的进程(x)、以用户格式输出(u);

-elf:显示系统内所有进程(-e)、以长格式输出信息(-l)、包括最完整的进程信息(-f);

 

·ps aux操作:

[查看命令第一行]# ps aux | head -1

USER  PID     %CPU %MEM    VSZ     RSS     TTY   STAT  START    TIME     COMMAND

用户  进程ID  %CPU %内存  虚拟内存 固定内存 终端  状态 起始时间 CPU时间  程序指令

 

·ps -elf操作:

[查看命令第一行]# ps -elf | head -1

F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD

PPID:父进程的PID号;

PRI/NI:进程优先级,数值越小优先级越高;

 

·top进程动态排名:

top交互式工具 命令格式:top [-d 刷新秒数] [-U 用户名]

top交互式操作指令:

- ?、h:查看帮助(列出可用的按键指令);

- P、M:根据%CPU、%MEM降序排列;

- 1:显示CPU详细运行信息;

- q:退出top程序;

 

应用程序性能技术

1.选择I/O尺寸

  执行I/O的开销包括初始化缓冲区、系统调用、上下文切换、分配内核元数据、检查进程权限和限制、映射地址到设备、执行内核和驱动代码来执行I/O,以及在最后释放元数据和缓冲区。增加I/O尺寸是应用程序提高吞吐量的常用策略。

2.缓存

  操作系统用缓存提高文件系统的读性能和内存的分配性能,应用程序使用缓存也处于类似的原因。将经常执行的操作结果保存在本地缓存中以备后用,而非总是执行开销较高的操作。

3.缓冲区

  为了提高写操作性能,数据在送入下一层级之前会合并并放在缓冲区中。这样会增加写延时,因为第一次写入缓冲区后,在发送之前,还要等待后续的写入。

4. 并发和并行

  并行:装在和开始执行多个可运行程序的能力(比如,同时接电话和吃饭)。为了利用多核处理器系统的优势,应用程序需要在同一时间运行在多颗CPU上,这种方>式称为并行。应用程序通过多进程或多线程实现。

  并发:有处理多个任务的能力,不一定要同时。比如,接完电话在去吃饭,存在资源抢占;

  同步原语:同步原语监管内存的访问,当不允许访问时,就会引起等待时间(延时)。常见三种类型:

mutex锁:只有锁持有者才能操作,其他线程会阻塞并等待CPU;

  自旋锁:自旋锁允许锁持有者操作,其他的需要自旋锁的线程会在CPU上循环自选,检查锁是否被释放。虽然这样可以提供低延时的访问,被阻塞的线程不会离开CPU,时刻准备着运行知道锁可用,但是线程自旋、等待也是对CPU资源的浪费。

  读写锁:读/写锁通过允许多个读者或者只允许一个写者而没有读者,来保证数据的完整性。

  自适应自旋锁:低延迟的访问而不浪费CPU资源,是mutex锁和自旋锁的混合。

5.绑定CPU

 

关于CPU性能分析

[查看系统运行了多长时间]# uptime

 18:15:48 up 132 days,  3:29,  5 users,  load average: 2.21, 1.93, 1.93

系统负载,通过汇总正在运行的线程数和正在排队等待运行的线程数计算得出。分别反映1/5/15分钟以内的负载。现在的平均负载不仅用来表示CPU余量或者饱和度,也不能单从这个值推断出CPU或者磁盘负载

 

[虚拟内存统计]# vmstat

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----

 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

 0  0      0 2566604   2280 4331576    0    0    10    25    1    0  0  0 100  0  0

最后几列打印系统全局范围内的CPU使用状态,在第一列显示可运行进程数。

提示:

r: 运行队列长度和正在运行的线程数;

b: 表示阻塞的进程数;

swpd: 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器;

si: 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

so: 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上;

bi: 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒;

bo: 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整;

in: 每秒CPU的中断次数,包括时间中断;

cs:  每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

st: cpu在虚拟化环境上在其他租户上的开销;

[以1秒统计10次虚拟内存]$ vmstat 1 10

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

 1  0 1139328 228084 264052 8089988    0    0    49   792    1    0 15  2 79  3  0

 1  0 1139328 228100 264052 8090180    0    0     0  4044 5792 8262 31  2 60  7  0

 2  1 1139328 227976 264052 8090368    0    0     0  4976 5713 8628 30  2 54 13  0

 3  0 1139328 249720 264024 8066012    0    0     0  4768 6945 9295 29 40 27  4  0

 1  0 1139328 250084 264024 8066216    0    0     0  3200 5076 7383 29  3 62  6  0

 2  0 1139328 250084 264032 8066364    0    0     0  5192 7508 11530 33  4 53 10  0

 5  1 1139328 249780 264032 8066560    0    0     0  3556 5353 7653 30  3 61  6  0

 1  0 1139328 249836 264032 8066708    0    0     0  5500 7652 11253 36  4 51  9  0

 2  1 1139328 249820 264032 8066916    0    0     0  2876 4968 6902 30  2 63  5  0

 4  1 1139328 249276 264032 8067112    0    0     0  5448 11489 15929 38  9 45  9  0

 

[报告处理器相关的统计数据]# mpstat

Linux 3.10.0-862.el7.x86_64 (bensongtan.com) 2018年10月17日 _x86_64_ (8 CPU)

 

18时28分00秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle

18时28分00秒  all    0.10    0.00    0.07    0.11    0.00    0.00    0.00    0.00    0.00   99.71

提示:

irq: 硬件中断CPU用量;

sofr: 软件中断CPU用量;

steal: 耗费在服务其他租户的时间;

guest: 花在访客虚拟机的时间;

重要关注列有%user/%sys/%idle。显示了每个CPU的用量以及用户态和内核态的时间比例。可以根据这些值查看那些跑到100%使用率(%user + %sys)的CPU,而其他CPU并未跑满可能是由单线程应用程序的负载或者设备中断映射造成。

[列出所有核心CPU并以每秒运行一次]$ mpstat -P ALL 1 1

Linux 2.6.32-696.30.1.el6.x86_64 (cmyt-web2) 10/18/2018 _x86_64_ (4 CPU)

 

09:32:53 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle

09:32:54 AM  all   31.49    0.00    2.77    4.28    0.00    0.50    0.00    0.00   60.96

09:32:54 AM    0   13.27    0.00    5.10   11.22    0.00    2.04    0.00    0.00   68.37

09:32:54 AM    1   10.00    0.00    6.00    6.00    0.00    0.00    0.00    0.00   78.00

09:32:54 AM    2  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00

09:32:54 AM    3    1.02    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.98

 

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle

Average:     all   31.49    0.00    2.77    4.28    0.00    0.50    0.00    0.00   60.96

Average:       0   13.27    0.00    5.10   11.22    0.00    2.04    0.00    0.00   68.37

Average:       1   10.00    0.00    6.00    6.00    0.00    0.00    0.00    0.00   78.00

Average:       2  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00

Average:       3    1.02    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.98

 

[收集、报告或保存系统活动信息]$ sar

Linux 2.6.32-696.30.1.el6.x86_64 (cmyt-web2) 10/18/2018 _x86_64_ (4 CPU)

 

12:00:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle

12:10:01 AM     all      3.72      0.00      2.82      4.52      0.00     88.94

……

用来观察当前的活动,以及配置用以归档和报告历史统计信息。基本上所有资源使用的信息,它都能够查看到。具体的参数说明如下所示:

-A: 所有报告的总和,类似"-bBdqrRSuvwWy -I SUM -I XALL -n ALL -u ALL -P ALL"参数一起使用;

-b: 显示I/O和传输速率的统计信息;

-B:显示分页状态;

-d:硬盘使用报告;

-r:内存和交换空间的使用统计;

-g:串口I/O的情况;

-b:缓冲区使用情况;

-a:文件读写情况;

-c:系统调用情况;

-n: 统计网络信息;

-q:报告队列长度和系统平均负载;

-R:进程的活动情况;

-y:终端设备活动情况;

-w:系统交换活动;

-x { pid | SELF | ALL }:报告指定进程ID的统计信息,SELF关键字是sar进程本身的统计,ALL关键字是所有系统进程的统计;

[整个CPU统计]$ sar -u 3 2

Linux 2.6.32-696.30.1.el6.x86_64 (cmyt-web2) 10/18/2018 _x86_64_ (4 CPU)

 

09:47:33 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle

09:47:36 AM     all     29.61      0.00      2.77      8.89      0.00     58.72

09:47:39 AM     all     30.26      0.00      2.77      8.38      0.00     58.59

Average:        all     29.94      0.00      2.77      8.64      0.00     58.66

[各个CPU统计]$ sar -P ALL 1 1

Linux 2.6.32-696.30.1.el6.x86_64 (cmyt-web2) 10/18/2018 _x86_64_ (4 CPU)

 

09:48:06 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle

09:48:07 AM     all     32.66      0.00      3.04     10.38      0.00     53.92

09:48:07 AM       0     16.00      0.00      6.00     24.00      0.00     54.00

09:48:07 AM       1     13.13      0.00      5.05     18.18      0.00     63.64

09:48:07 AM       2      2.00      0.00      1.00      0.00      0.00     97.00

09:48:07 AM       3    100.00      0.00      0.00      0.00      0.00      0.00

 

Average:        CPU     %user     %nice   %system   %iowait    %steal     %idle

Average:        all     32.66      0.00      3.04     10.38      0.00     53.92

Average:          0     16.00      0.00      6.00     24.00      0.00     54.00

Average:          1     13.13      0.00      5.05     18.18      0.00     63.64

Average:          2      2.00      0.00      1.00      0.00      0.00     97.00

Average:          3    100.00      0.00      0.00      0.00      0.00      0.00

1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈;

2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量;

3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU;

 

[tanbensong@cmyt-web2 ~]$ sar -r 1 2

Linux 2.6.32-696.30.1.el6.x86_64 (cmyt-web2) 10/18/2018 _x86_64_ (4 CPU)

 

03:54:19 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit

03:54:20 PM    413452  32601372     98.75    290352   7924228  44747628    120.26

03:54:21 PM    412832  32601992     98.75    290352   7924360  44748140    120.26

Average:       413142  32601682     98.75    290352   7924294  44747884    120.26

kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap);

%commit:这个值是kbcommit与内存总量(包括swap)的一个百分比;

[报告Linux任务的统计信息]# pidstat

Linux 3.10.0-862.el7.x86_64 (bensongtan.com) 2018年10月19日 _x86_64_ (8 CPU)

 

10时08分07秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command

10时08分07秒     0         1    0.00    0.00    0.00    0.00     0  systemd

10时08分07秒     0         2    0.00    0.00    0.00    0.00     2  kthreadd

……

主要用于监控全部或指定进程占用系统资源的情况,如CPU、内存、设备IO、任务切换、线程等。

 

[指定PID内存使用情况]# pidstat -r -p 28268 1 2

Linux 3.10.0-862.el7.x86_64 (bensongtan.com) 2018年10月19日 _x86_64_ (8 CPU)

 

10时16分59秒   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command

10时17分00秒  1000     28268      0.00      0.00   50624   6152   0.08  nginx

10时17分01秒  1000     28268      0.00      0.00   50624   6152   0.08  nginx

平均时间:  1000     28268      0.00      0.00   50624   6152   0.08  nginx

 

[指定PIDCPU使用情况]# pidstat -u -p 28268

Linux 3.10.0-862.el7.x86_64 (bensongtan.com) 2018年10月19日 _x86_64_ (8 CPU)

 

10时18分47秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command

10时18分47秒  1000     28268    0.00    0.00    0.00    0.00     0  nginx

minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数;

majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生;

 

[IO情况统计]# pidstat -d 1 2

Linux 3.10.0-862.el7.x86_64 (bensongtan.com) 2018年10月23日 _x86_64_ (8 CPU)

 

13时57分01秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command

13时57分02秒  1001     10713      0.00      3.92      0.00  mysqld

 

13时57分02秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command

13时57分03秒  1001     10713      0.00      8.00      0.00  mysqld

 

平均时间:   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command

平均时间:  1001     10713      0.00      5.94      0.00  mysqld

 

bensongtan@sina.com 2018.10.23

CPU亲和力优化

1.修改进程的优先级

[检查服务是否开启和PID号]# netstat -nutpl | grep -w 80

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      10856/nginx: master

[动态查看单个进程]# top -p 10856

Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie

%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

KiB Mem :  7931588 total,   946212 free,  2620224 used,  4365152 buff/cache

KiB Swap:  8126460 total,  8126460 free,        0 used.  4927400 avail Mem

 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                   

10856 root      20   0   46164   2168   1080 S   0.0  0.0   0:00.00 nginx                     

1.1使用renice命令修改进程的优先级

[查看命令路径]# which renice

/bin/renice

[查看命令安装包]# rpm -qf /bin/renice

util-linux-2.23.2-52.el7.x86_64

[调进程的优先级]# renice -n 1 10856

10856 (进程 ID) 旧优先级为 0,新优先级为 1

 

2.进程绑定到固定CPU

[显示进程树]# pstree -p | grep nginx

           |-nginx(10856)-+-nginx(28268)

           |              |-nginx(28269)

           |              |-nginx(28270)

           |              |-nginx(28271)

           |              |-nginx(28272)

           |              |-nginx(28273)

           |              |-nginx(28274)

           |              `-nginx(28275)

[查看单进程在那个核心CPU上]# taskset -cp 10856

pid 10856's current affinity list: 0-7

0-7 表示在多个核心CPU来回运行

[查看单个进程在那个核心CPU上]# taskset -cp 28268

pid 28268's current affinity list: 0

[显示进程树]# pstree -p | grep 16667

           |                                    `-{mysqld}(16667)

[查看进程CPU]# taskset -cp 16667

pid 16667's current affinity list: 0-7

[绑定到固定CPU]# taskset -cp 0 16667

pid 16667's current affinity list: 0-7

pid 16667's new affinity list: 0

[检查]# taskset -cp 16667

pid 16667's current affinity list: 0

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值