Linux系统性能与调优

一、基本概念

QPS:query per second, 1秒内完成的请求数
RT:response time, 1个请求完成的时间
Throughput越大,Latency会越差。因为请求量过大,系统太繁忙,所以响应速度自然会低
Latency越好,能支持的Throughput就会越高。因为Latency短说明处理速度快,于是就可以处理更多的请求

最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间) * cpu数量
线程过多,时间消耗长,并不是说代码执行效率下降了,而是资源的竞争,导致线程等待的时间上升了,线程越多消耗内存越多,过多的线程直接将系统内存消耗殆尽

平均响应时间 = (并发线程数/最佳线程数) * 最佳线程数的响应时间

总QPS=线程数*单个线程的QPS

二、系统调优的目的

  • (1)调优的目的是高效地使用资源,尽可能地使用最多的资源,从而提高性能

  • (2)任何资源都要查看是资源使用率满了,还是没有高效使用资源
    例如CPU使用率高,是因为算法问题(死循环,低效算法),还是因为程序本身就需要这么多CPU。如果CPU使用率低,则查看是因为资源等待还是线性操作。
    又如I/O,wa低下,也有可能I/O的问题(当然不是硬件问题),wa低下代表磁盘的使用率低下。这时要看到底是程序本身不怎么使用磁盘,还是没有高效使用(大量随机操作,而不是批量操作,顺序写入,使用缓冲等)

  • (3)如果要提升服务器端的响应时间RT
    采用减少IO的时间能达到最佳效果,比如合并多个IO请求
    减少IO的调用次数:并发HTTP请求(无上下文依赖,多个连接,一个线程)、HTTP连接池(长连接)
    减少CPU的使用时间
    使用缓存

  • (4)如果要提升QPS
    采用优化CPU的时间能达到最佳效果,同时可以加大线程数
    减少CPU的使用时间
    增加CPU的数量
    减少同步锁
    如果CPU不能被压到85%以上,并且此时的QPS已经达到了峰值,则说明另有瓶颈

三、影响性能的因素

想确定有哪些因素,首先确定你的应用是什么类型的?

例如:
1.cpu密集型
例如web服务器像nginx node.js需要CPU进行批处理和数学计算都属于此类型

  1. io密集型
    例如数据库常见的mysql,大量消耗内存和存储系统,对CPU和网络要求不高,这种应用使用CPU来发起IO请求,然后进入sleep状态。
  • 确定了应用类型就开始分析有哪些情况能影响性能:
    大量的网页请求会填满运行队列、大量的上下文切换,中断
    大量的磁盘些请求
    网卡大量的吞吐
    以及内存耗尽等。。

  • 归结起来就是4个方面
    cpu
    memory
    i/o
    network

-常用的性能分析工具
htop vmstat iotop sar strace iftop ss lsof ethtool mtr等

四、常见的内核参数优化

cat >>/etc/sysctl.conf<<EOF
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000    65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
#以下参数是对iptables防火墙的优化,防火墙不开会提示,可以忽略不理。
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
EOF    
sysctl –p       <<-配置完成后查看

禁止Linux被ping会增加系统安全:echo "net.ipv4.icmp_echo_ignore_all=1">>/etc/sysctl.conf
使其生效:sysctl -p

五、更改SSH服务端远程配置

修改默认文件路径
vim /etc/ssh/sshd_config
修改的参数
port       #端口
PermitEmptyPasswords   #是否允许密码为空的用户远程登录
PermitRootLogin             #是否允许root登录
UseDNS                        #指定sshd是否应该对远程主机名进行反向解析,以检查主机名是否与其IP地址真实对应。默认yes.建议改成no ,否则可能会导致SSH连接很慢。
GSSAPIAuthentication no   #解决linux之间使用SSH远程连接慢的问题
ListenAddress    #监听指定的IP地址

六、内存参数优化

另外让系统管理大量内存有两种方法:
(1)增加硬件内存管理单元中页表数
(2)增大页面大小
第一种方法不太现实,所有我们考虑第二种方法。即:大页面。
32位系统4m大页框64位系统2m大页框,页框越粗浪费越严重。

查看系统的大页面:
cat /proc/meminfo
AnonHugePages: 309248 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 6144 kB
DirectMap2M: 1042432 kB
DirectMap1G: 0 kB
AnonHugePages:透明大页面,THP是一个提取层,可自动创建、管理和使用超大页面的大多数方面。
另外HP必须在引导时设置。
手动设置大页面的页数:
sysctl vm.nr_hugepages = 20
  • DMA:直接读取内存
    在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。

  • 虚拟内存:
    32位的系统上每一个进程在访问内存的时候,每一个进程都当做自己有4个G的内存空间可用,这叫虚拟内存(地址),虚拟内存转化成物理内存是通过MMU来完成的。生产中我们尽量不使用虚拟内存。

  • 影响系统性能的几个内存参数:

  • overcommit_memory 过量使用内存
    0 默认设置系统决定是否过量使用。
    1 不过量使用
    2 过量使用但有一定的比例默认百分值五十由overcommit_ratio决定(他就是默认的50),举个例子物理内存8g,swap4g,可以过量使用10g。
    注:生产中尽量避免过量使用,例如redis要关闭过量使用。

  • spappines
    将不活跃的进程换进swap。注:尽量不去使用swap。
    生产中设置:
    echp 10 > /proc/sys/vm/swappines

  • 回收内存
    这个值设定为 1、2 或者 3 让内核放弃各种页缓存和 slab 缓存的各种组合。
    1 系统无效并释放所有页缓冲内存即buffers
    2 系统释放所有未使用的 slab 缓冲内存。即cached
    3 系统释放所有页缓冲和 slab 缓冲内存。
    生产中使用:
    1.运行sync
    echo 3>/proc/sys/vm/drop_caches

原文地址:https://www.cnblogs.com/wangchengshi/p/11039294.html