• 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

  • 相关阅读:
    python第二课
    python第一课
    Python基础20-类的创建与删增改查
    Python基础19模块-hashlib模块
    Python基础18模块-configerparse模块
    Python基础17模块-logging模块
    Python基础16模块-re模块
    Python基础-15模块-OS模块
    Python基础-14模块-random模块
    Python基础-13模块-时间模块
  • 原文地址:https://www.cnblogs.com/wangchengshi/p/11039294.html
Copyright © 2020-2023  润新知