• 优化-cpu


    优化
    横向:加新的设备,架构扩展
    纵向:替换新的更好的设备,使设备负载能力更高
    下面我们讨论的是不加设备也不换设备的基础上进行系统微调
    前面讨论的是系统安装到业务上线之前的一些基本优化,如果业务已经在线上,你要优化,第一步如何做?
    比如一个web服务器慢,可以会有哪些问题?
    cpu->mem->io->file system->network->os参数->服务本身配置-》开发代码
    首先要进行服务器数据采集,和性能监测分析
    方法有
    一:使用cacti,nagios,zabbix等监控工具
    二:使用linux自带的一些监控指令:如vmstat,iostat,mpstat,sar等等
    硬件问题
    CPU子系统
    内存子系统
    IO子系统
    网络子系统
    文件系统
    运行的服务等
    一,
    cpu(Central Processing Unit)子系统
    CPU 的占用主要取决于什么样的资源正在 CPU 上面运行,
    比如拷贝一个文件通常占用较少CPU,只是在完成拷贝以后给一个中断让CPU知道拷贝已经完成
    科学计算通常占用较多的CPU,大部分计算工作都需要在CPU上完成,内存、硬盘等子系统只做暂时的数据存储工作
    要想监测和理解CPU的性能需要知道一些的操作系统的基本知识,比如:中断,进程调度,进程上下文切换,可运行队列等
    cpu单核在同一个时间点只能干一件事,但单核CPU一样可以跑多任务操作系统,其实就是分CPU资源(时间片)
    CPU很无辜,是个任劳任怨的打工仔,每时每刻都有工作在做(进程、线程)并且自己有一张工作清单(可运行队列),
    由老板(进程调度)来决定他该干什么,他需要和老板沟通以便得到老板的想法并及时调整自己的工作  (上下文切换),
    部分工作做完以后还需要及时向老板汇报(中断),
    所以打工仔(CPU)除了做自己该做的工作以外,还有大量时间和精力花在沟通和汇报上。
    中断 设备通知内核,完成了一次数据处理过程。也可以理解为:cpu停止下来去执行别的指令。例如:完成一次IO。或者完成一次网络数据包的发送。
    内核处理过程 --- 控制优先级,进行任务调度。
    用户进程
    上下文切换 --- 把正在占用cpu的进程放回队列中(每次内核的上下文切换,资源被用于关闭在CPU寄存器中的线程和放置在队列中)
    运行队列
    那么监测CPU性能的底线是什么呢?通常我们期望我们的系统能到达以下目标:
      CPU利用率,如果CPU有100%利用率,那么应该到达这样一个平衡:65%-70% User Time,30%-35% System Time,0%-5% Idle Time;
      上下文切换,上下文切换应该和 CPU 利用率联系起来看,如果能保持上面的 CPU 利用率平衡,大量的上下文切换是可以接受的;
    云(虚拟化)  提高资源利用率
    查看cpu信息
    # cat /proc/cpuinfo --能看到指令集,CPU核数,频率,缓存等相关信息
    要采集CPU当前正在运行的信息数据,要用到下面的命令或者监控软件(nagios,zabbix等)
    top
    uptime
    vmstat
    mpstat --需要yum install sysstat
    sar --需要yum install sysstat
    # vmstat 2 每2秒钟采集一下数据
    # vmstat 2 3 每2秒钟采集一次,一共采集3次
    # vmstat 2
    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 0 78112 63432 1519100 0 0 233 18 1906 1190 26 13 59 1 0
    1 0 0 78112 63432 1519100 0 0 0 0 4180 1378 33 17 50 0 0
    r 可运行队列。单核cpu,不应该超过3(经验得到的数据,只是表明大于这个值表明运行队列有点长)
    b 当前被阻塞的进程,一般这些进程都是在等待某些外部资源而被阻塞。>3需要注意,而且一直出现或者经常出现,就更值得注意
    in 中断数。一般代表大量设备操作成功通知内核。
    cs 上下文切换。一般代表任务需要紧急被cpu处理。数字高,只能说明内核在充分发挥它的任务调度作用。不能简单通过该数字判断cpu就出现瓶颈。
    us 用户进程所占用的cpu时间的百分比
    sy 内核在进行任务调度所占用的cpu时间的百分比
    id cpu空闲所占用的时间百分比.仅仅0不能简单判断cpu出现瓶颈,只能说它被充分被留用。
    wa 等待IO所消耗时间百分比
    st 被硬件虚拟化的虚拟机所消耗掉的时间百分比
    mpstat 和 vmstat 类似,不同的是 mpstat 可以输出多个处理器的数据
    # mpstat -P ALL 1 ---P ALL表示查看所有CPU核, 1表示每一秒显示一次
    10:46:35 AM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
    10:46:36 AM all 26.13 0.00 6.53 0.00 3.52 9.05 0.00 54.77 19478.22
    10:46:36 AM 0 25.74 0.00 6.93 0.00 2.97 7.92 0.00 56.44 9740.59
    10:46:36 AM 1 26.73 0.00 6.93 0.00 3.96 10.89 0.00 51.49 9739.60
    # sar -u 查看cpu相关的历史数据 --这是历史数据,是每十分钟会去采集一次系统相关的数据
    # sar -u 2 3 --两秒一次,显示三次(不是历史数据,是当前动态数据)
    sysstat --> 提供 sar 命令 (system activity reporter)
    sar的特点:可以对过去时间的系统状态进行分析,但不能对某个进程进行深入分析,只能对系统的整体情况进行分析。
    yum install sysstat -y
    # service sysstat start
    # chkconfig sysstat on
    安装systat包后,就会自动在 /var/log/sa/saxx 产生数据 xx代表日期
    可以使用sar -f /var/log/sa/saxx 去访问 加参数就可以访问不同类型的性能数据
    指定查询之前的日期与固定时间点的方法
    sar -u -f /var/log/sa/sa18 --查看这个月已经过的18号的cpu历史数据
    sar -u -f /var/log/sa/sa18 -s 09:00:00 -e 10:00:00 --指定只看18号9点到10点的cpu历史数据
    保存性能数据
    sar支持保存成两种格式的文件,一种是文本文件,一种是二进制文件 (只有通过sar自己的命令 -f 参数 才能看)
    保存为文本文件,可以直接cat命令查看
    sar -p 1 5 > /tmp/test/sar1.txt
    保存为二进制文件
    sar -p 1 5 -o /tmp/test/sar2.txt 1>/dev/null --会显示到屏幕,可以用1>/dev/null
    file /tmp/test/sar2.txt --是data类型文件
    sar -f /tmp/test/sar2.txt --使用-f参数读取
    可以通过做实验,再来用vmstat,mpstat,sar来看cpu的变化
    如:执行下面的sh /tmp/2.sh脚本,产生一百个运算的进程
    [root@li ~]# cat /tmp/1.sh
    #!/bin/bash
    a=1
    sum=0
    while true
    do
    sum=$[$sum+$a]
    let a++
    done
    [root@li ~]# cat /tmp/2.sh
    #!/bin/bash
    for i in `seq 100`
    do
    sh /tmp/1.sh &
    done
    ===========================================================
    总结:现在的架构cpu极少会成为瓶颈.就算是真的cpu成为了瓶颈,对cpu能做的优化太少了(要么就换硬件,要么通过扩展架构来分担压力,杀掉无用并且占用资源的进程)
    系统管理员能改的也就只有进程优先级了
    nice 优先级 能调的范围是 -20到19 -20表示优先级最高,19最低
    用户运行一个程序默认给的优先级为0
    renice 对一个已经运行的进程进行nice值的调整
    renice 19 pid
    [root@li ~]# vim /tmp/test.sh
    a=1
    while [ $a -lt 1000000 ]
    do
    let a++
    done
    nice 优先级高的能够优先分配资源,跑得快,花费的时间少,负载越高,效果越明显
    实验
    在一个负载高的情况下做效果更好,比如一个大文件的cp
    第一个终端:
    [root@li ~]# time sh /tmp/test.sh
    real 0m39.363s
    user 0m26.338s
    sys 0m0.900s
    第二个终端:
    [root@li ~]# time nice --19 sh /tmp/test.sh --19 第一个是参数的横杠,第二个是负号
    real 0m26.881s
    user 0m26.008s
    sys 0m0.871s
    --对比上面的时间,可以看到 高优先级的花费的时间少
    可以把上面的实验再做一次,马上用top查出-19的pid值,并使用renice修改
    renice 19 9683
    [root@li ~]# time sh /tmp/test.sh
    real 0m34.665s
    user 0m26.277s
    sys 0m0.896s
    [root@li ~]# time nice --19 sh /tmp/test.sh
    real 0m37.231s
    user 0m26.094s
    sys 0m0.905s
    --从上面的时间可以看出,-19优先级的半路被改为19后,所花费的时间反而多了
    注意:只有管理员才能把优先级往高调,普通用户只能调自己的,并且只能往低调,调低后还不能再调高
  • 相关阅读:
    二叉树前中后、层次遍历
    二叉查找树-插入、查找某个值节点、查找前驱或后继、删除
    查找算法-二分、插值、斐波那契
    8个排序算法
    split函数实现
    strlen、strcmp、strcat、strlen、memmove
    thinkphp5 404 file_put_contents 无法打开流:权限被拒绝
    小程序之旅——第六站(模板首页)
    小程序之旅——第五站(登陆)
    小程序之旅——第三站(数据库用户权限设计)
  • 原文地址:https://www.cnblogs.com/skyzy/p/9201438.html
Copyright © 2020-2023  润新知