• Linux性能优化参考


    1、获取指标数据
    使用dstat命令
    dstat命令:--output 输出数据到文件 4 每多少秒刷新数据
    date && dstat -tclmsdnrpy --output 功能_ip1_yyy-mm-dd_并发数.csv 4
    date && dstat -tclmsdnrpy --output 功能_ip2_yyy-mm-dd_并发数.csv 4


    2、关注指标
    主要指标有
    超时概率<=0.05% 错误概率<=0.05% tps>=预期tps
    响应时间<=预期响应时间 cpu利用率<=70% 系统负载<=CPU核数*CPU个数*0.7
    jvm内存使用率<=70% full gc 频率>平均半小时1次

    先看内存->IO->网络->CPU

    3、监控说明
    包括监控:CPU 内存 磁盘I/O 网络I/O 系统负载 系统配置参数的使用情况

    3-1)cpu(关注 %us %sy %wa)
    top命令使用参考:https://www.cnblogs.com/wangkangluo1/archive/2012/04/18/2454993.html
    大型公司CPU安全值:50%
    一般公司的要求不高的项目,CPU安全值:70%
    使用top命令

    查看所有进程信息
    top -c

    查看单个进行下的所有线程信息
    top -Hp pid -c

    排序显示对应列数据(CPU%:P MEM%:M TIME%+:T 优先级:N)

    切换显示负载和平均启动信息:l
    切换显示进程和CPU信息:t
    切换显示内存信息:m
    切换显示命令行信息:c
    top -c

    cpu使用率<=70%
    cpu中用户进程消耗比率 %us<50%
    cpu中内核进程消耗比率 %sy<50%
    cpu中用于等地IO消耗的比率 %wa<5%

    %sy过高 则分析请求系统调用的资源是否出现中断、阻塞
    %us过高 则分析是否存在大量或复杂的计算、低效的业务逻辑代码

    时间片(CPU工作的最小单元):windows:20ms Linux:40~180ms
    中断(是一组信号,软中断:CPU执行完成了需要休息,硬件中断:有更重要的事情需要处理)

    3-2)内存(关注:r si so bi bo wa)
    使用vmstat命令 free命令
    查看内存信息
    free -m
    cat /proc/meminfo

    vmstat -n 5
    cpu利用率:us%<=50% sy%<=50 us%+sy%<=70%
    cs 上下文切换:cpu利用率良好,大量的CS也是允许的
    r 为可运行队列数:值过大表示CPU繁忙,每次处理器可运行队列数<=2*cpu核数*CPU个数
    b 为阻塞并等待IO的进程数

    swapd>0,且变动,si so为0,表示内存使用比较正常,si so值不为0,表示内存不够用
    内存使用率:(free+buff+cache)/total<=70%

    内存能用则用:当使用内存时,启动一个就线程时,可以直接用原来的数据。

    cache:程序未处理,从硬盘中刚读取出来的数据。
    buff:程序处理完,准备写入硬盘的数据。

    内存的使用=use-buff-cache
    未使用的内存=free+buff+cache


    3-3)系统负载(关注10分钟、15分钟负载情况) CPU超过安全值,才关注该项
    使用top命令或uptime命令

    top命令的系统负载区域
    load average: 1分钟负载数据, 5分钟负载数据, 15分钟负载数据
    当前时刻CPU中正在运行和等待运行进程队列数总和,反应了CPU资源申请和分配的情况
    uptime<0.7*CPU核数*CPU个数

    cpu总核数=物理cpu个数*每cpu的核数
    总逻辑cpu数=cpu总核数*超线程数

    查看物理cpu个数
    grep 'physical id' /proc/cpuinfo |sort -u|wc -l

    查看cpu核数
    grep 'core id' /proc/cpuinfo |sort -u |wc -l

    查看cpu信息
    grep 'model name' /proc/cpuinfo |sort -u |cut -f2 -d:


    3-4)磁盘IO(关注:r/s w/s avgqu-sz await svctm %util)
    每隔3秒刷新显示数据,显示200次,同时kByte方式显示指定dm-0磁盘的IO信息
    使用iostat命令或sar命令
    iostat -kx -d dm-0 3 200

    小文件:<=1MB,中文件:1MB~10MB,大文件:10MB~100MB 超大文件:>100MB RAID100~RAID150

    良好:await<=svctm 槽糕:await>>svctm
    优良:%iowait<20% 中等:20%<=%iowait<35% 不合格:35%<=%iowait<50% 槽糕:%iowait>=50%
    优良:%util<80% 槽糕:%util>=80%

    安全值:A点 %idle>60% B点 %idle>40% %user<50% %iowait<70% %system使用越少越好,读写不能超过物理上线

    写入跟不上:写入/读取并发,增加调用资源的权限或配置

    IO瓶颈:
    1)日志写入问题,调高日志级别
    2)上传和下载:硬件(RAID)、软件(并发、链接处理,软件架构的一致性,异步机制)


    iostat结果项
    rrqm/s 每秒设备相关的读取请求有多少被合并
    wrqm/s 每秒设备相关的写入请求有多少被合并

    rio+wio 为总的iops
    r/s 每秒完成的读I/O设备的次数 rio/s
    w/s 每秒完成的写I/O设备的次数 wio/s
    wkB/s 每秒写入的数据量
    rkB/s 每秒读取的数据量
    avgrq-sz 平均每次设备I/O操作数据大小
    avgqu-sz 平均IO队列长度
    await 每次设备I/O操作的等待时间(毫秒)
    svctm 每次设备I/O操作的服务时间(毫秒)
    %util 设备繁忙程度,每次设备在1秒钟有多少时间用于I/O操作

    查看磁盘统计信息
    df -halT --total

    查看磁盘分区信息
    cat /proc/partitions
    major 主设备号 8为sda磁盘
    minor 次设备号 5为第5分区
    blocks 设备总块数
    name 设备名称

    sar命令
    sar [options] [-A] [-o file] t[n]
    sar -u -q -B -b -r 5 10
    options 命令选项 t 采样间隔 n采用次数 -o 将结果已二进制形式存储到file文件
    -a 显示所有设备信息

    -p 显示指定cpu信息
    -u 显示所有cpu在采样间隔时间内的信息

    -b 显示缓冲区的使用情况信息
    -c 显示系统调用的使用情况信息
    -w 显示系统交换活动状态信息

    -v 显示进程 节点 文件和锁表的状态信息
    -q 显示运行队列的大小信息
    -R 显示进程活动的信息

    -r 显示内存使用信息
    -B 显示内存分页统计信息

    -d 显示系统所有磁盘信息
    -g 显示串口IO信息
    -a 显示系统文件读写信息
    -y 显示终端设备活动情况信息

    -n 显示网络运行状态信息 DEV 网络接口 EDEV 错误的网络接口 SOCK 套接字 FULL 所有

    常见sar命令
    查看cpu使用情况 sar -q sar -u

    查看内存使用情况 sar -B sar -r

    查看交换区使用情况 sar -W

    查看磁盘使用情况 sar -d sar -b

    查看网络使用情况 sar -n NDEN

    swap:在硬盘划出一个区,以提升磁盘的读写速率,可当做内存使用。

    3-5)网络I/O
    建议网络带宽<=40%最大带宽
    watch netstat -lunp
    watch netstat -su

    单个网卡使用率 A点<35%、B点<40%,双网卡使用率 A点<70%、B点<80%
    丢包率 rxdrop/s txdrop/s<0.5%


    3-6)系统配置参数(关注:tcp连接情况)
    tcp各状态连接情况统计
    netstat -n |awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'

    netstat -nat | awk 'FNR>2{print $NF}' | sort | uniq -c

    查看TIME_WAIT连接情况
    netstat -n|grep 'TIME_WAIT'

    解决TIME_WAIT过多的方法
    vi /etc/sysctl.conf

    net.ipv4.tcp_syncookies = 1 是否开启SYN Cookies(启用后,可防止SYN等待队列的溢出)
    net.ipv4.tcp_tw_reuse = 1 是否开启重用(允许重复利用已开启的TCP连接)
    net.ipv4.tcp_tw_recycle = 1 是否开启快速回收(开启快速回收TCP连接,防止长时间不用的TCP连接消耗资源)
    开始tpc_tw_recycle时,需要设置 net.ipv4.tcp_timestamps=0 忽略报文的时间戳
    net.ipv4.ip_local_port_range = 1024 65000 端口范围(扩展端口范围,防止端口不够用时,程序出现问题)
    net.ipv4.tcp_max_syn_backlog = 8192 SYN队列长度(SYN队列的长度,可允许等待连接的网络连接数)
    net.ipv4.tcp_fin_timeout = 30 修改系统默认的TIMEOUT时间
    net.ipv4.tcp_keepalive_time = 1200 tcp发送keeplive的频度,单位为秒
    net.ipv4.tcp_max_tw_buckets = 5000 保持TIME_WAIT的数量

    4、监控JVM
    关注内存溢出、内存泄露、线程死锁、消耗CPU资源的JAVA代码、锁争用等
    4-1)jinfo(显示JVM运行时参数信息)

    jinfo [ options ] [ pid ]
    jinfo pid


    4-2)jps(显示JVM中进程状态信息)可以获取进程ID

    jps [options] [hostid]
    jps -l
    输出传入main、jar、类的参数信息

    jps -m
    输出传入mian方法的入参信息

    jps -v
    输出传入JVM的入参信息

    jps -q
    不输出传入main、jar、类的参数信息


    4-3)jstack(显示进程中的线程堆栈信息 java进程ID 内核文件(core file) 远程调用服务的JAVA进程内线程的堆栈信息)
    使用jstack时,如果是在64位机器上操作,则需加上参数 -J-d64
    需要将用户切换到启动中间件所使用的用户,否则使用jstack会出现错误
    jstack [option] pid
    jstack [option] executable core
    jstack [option] [server-id@]remote-hostname-or-ip


    显示锁的附加信息,可以看到是否存在死锁等信息
    jstack -l pid

    显示java栈和C++栈等本地方法栈的信息
    jstack -m pid

    根据应用定位消耗资源高的线程


    步骤1:ps -ef |grep '应用名称'|grep -v grep

    步骤2:top -Hp pid -Mc 或 ps -Lfp pid 或 ps -mp pid -o THREAD,tid,time

    步骤3:printf "%x " pid 得到16进制的数字 upid 比如:printf "%x " 326800 得到 4fc90

    步骤4:jstack pid |grep upid 比如:jstack 326800 |grep 0x4fc90 根据显示的信息分析并定位引起消耗很高资源的代码

    4-4)jstat(java应用程序的资源和性能进行实时监控工具,包括堆和垃圾回收信息的监控)
    jstat使用:https://www.cnblogs.com/yjd_hycf_space/p/7755633.html
    jstat [ option pid [interval [ s | ms ] [count] ] ]
    -gcutil 输出已使用空间占总空间的百分比
    -gccapacity 输出堆中各个区域使用到的最大和最小空间

    4-5)jhat(堆内存dump分析工具或者用MAT,Eclipse上的工具)
    jhat data.hprof 分析用jmap命令生成hprof文件
    http://localhost:7000 访问报告文件

    jmap -dump:format=b,file=./tmp/dump.dat pid


    4-6)jcmd(内存分析工具、查看java进程、执行gc、导出线程、导出堆信息等)
    jcmd [ options ]
    jcmd [ pid | main-class ] PerfCounter.print
    jcmd [ pid | main-class ] command [ arguments ]
    jcmd [ pid | main-class ] -f file

    pid 进程ID

    main-class 接收命令请求进程的main类

    PerfCounter.print 目标性能计数器

    command[arguments]
    假如要发送一个诊断命令请求到 jcmd com.example.MyClass name="Value of name argument" 则格式如下:
    jcmd com.example.MyClass name="Value of name argument"


    -file
    从文件上读取命令,然后在目标java进程上调用这些命令,以#开头的命令或被忽略,当所有行的命令被读取完,或遇到stop关键字,
    则会终止对fiel文件的处理,每个命令必须单独存为一行。


    查看运行的所有虚拟机信息
    jcmd -l


    打印线程栈信息
    jcmd pid -Thread.print

    查看系统中类统计信息
    jcmd pid GC.class_histogram


    导出堆信息
    jcmd pid GC.heap_dump

    虚拟机的启动时间
    jcmd pid VM.uptime

    查看系统属性信息
    jcmd pid VM.system_properties


    查看启动参数信息
    jcmd pid VM.flags

    获取性能相关数据
    jcmd pid PerfCount.print
    jcmd 21644 help

    21644:
    The following commands are available:

    JFR.stop
    JFR.start
    JFR.dump
    JFR.check
    Thread.print
    ManagementAgent.stop
    ManagementAgent.start_local
    ManagementAgent.start

    GC.rotate_log
    GC.class_stats
    GC.class_histogram
    GC.heap_dump
    GC.run_finalization
    GC.run

    VM.uptime
    VM.flags
    VM.system_properties
    VM.command_line
    VM.version
    VM.native_memory
    VM.check_commercial_features
    VM.unlock_commercial_features


    4-7)jvisualvm JDK中自带的jvisualvm工具和jconsole工具,用于分析和监控JVM,推荐使用jvisualvm


    5、系统负载能力浅析
    并发用户数与系统的负载能力存在关联关系。
    影响并发用户数的因素有:
    带宽

    硬件配置(cpu频率/核数、内存大小/速度、硬盘速度)

    系统配置(文件描述符数量:系统中打开最大文件数,单个进程打开最大的文件数、进程或线程数量:是否采用多进程或多线模式的运行方式、TCP内核参数:Linux内核参数)

    文件描述符数量
    系统打开最大文件数量:临时修改:/proc/sys/fs/file-max 永久修改:/etc/sysctl.conf fs.file-max
    单个进程打开最大文件数量:临时修改:ulimit -n 永久修改:/etc/security/limits.conf nofile
    所有进程打开最大文件数量 需小于 /proc/sys/fs/file-max
    单个进程打开最大文件数量 需小于 user limit中nofile的soft limit
    nofile的soft limit不能超过其hard limit
    nofile的hard limit不能超过/proc/sys/fs/nr_open

    进程或线程数量:
    单个用户打开的最大线程数:/etc/security/limits.conf noproc 与/usr/include/bits/local_lim.h PTHREAD_THREADS_MAX有关
    系统打开的最大线程数:/proc/sys/kernel/threads-max
    线程栈大小 ulimit -s

    应用服务器配置(参考Apache、Nginx、Tomcat优化配置,及数据库的优化MySQL、Redis)
    程序逻辑
    系统架构(负载均衡、同步或异步、28原则)
    nginx经典配置:
    https://github.com/superhj1987/awesome-config/blob/master/nginx/nginx.conf
    tomcat经典配置:
    https://github.com/superhj1987/awesome-config/blob/master/tomcat/java_opts.conf
    https://github.com/superhj1987/awesome-config/blob/master/tomcat/connector.conf
    线程状态分析:https://www.cnblogs.com/trust-freedom/p/6606594.html
    jstat使用:https://www.cnblogs.com/yjd_hycf_space/p/7755633.html

  • 相关阅读:
    【318】C# 学习笔记
    【317】python 指定浏览器打开网页 / 文件
    【316】python.requests 读取网页信息
    【315】Windows 之间代码自动传文件
    多线程经典问题-----乘客做公交车问题解答3
    VS2013/2012 下无法打开 源 文件“stdafx.h”的解决方法
    [课堂实践与项目]手机QQ客户端--4期(SQLite的加入,注册,找回,登录界面的修改):建立关于QQ注册类,使用SQLite进行存储,
    《Effective C++》学习笔记条款13 以对象管理资源
    抛弃编程语言的偏见——对话百度架构师
    IOS开发之UINavigationBar
  • 原文地址:https://www.cnblogs.com/NiceTime/p/6780084.html
Copyright © 2020-2023  润新知