性能调优

作者: 飞天的猪_ba05 | 来源:发表于2018-11-26 21:19 被阅读141次

    本来这次要写支付相关的话题,主要是这周是我分享,所以就来说说我上一家公司做的事吧

    上一家公司同盾,做的一件事就是风控。哪有风险,哪就有风控。风控是app的一道防火墙。
    之前所在的部门是企业组,主要是将风控产品输出给银行、互金平台等。这是一块大蛋糕,有很多的竞争对手。风控需要的是精准和快速,所以我们需要比别人更快,比别人更准。快、准、狠秒杀对手。
    我主要的工作就是风控软件的性能调优,以下是我性能调优分享,不过不是具体怎么调优,而是调优的思路

    什么是性能?(who)

    性能调优,那么什么是性能?这里要讲的不是汽车发动机的性能,而是软件的性能。软件其实是看不见摸不着的,不同人对软件的理解也不一样,所以在不同人眼里,性能表现的形式就不一样

    什么是性能

    作为架构师(我的目标),在设计软件的架构的时候,就需要考虑到不同人眼里的问题----一切尽在掌握之中

    什么是性能调优?(what)

    我们知道软件是放在服务器上跑的,服务器又可分解为硬件和操作系统。


    服务器

    如上图,简单来说包括三块:硬件、操作系统、应用程序。其实,性能调优就是调节这些内容,包括硬件、操作系统、应用程序。

    • 硬件
      CPU、内存、磁盘、网卡、其它……,
    • 操作系统
      进程、虚拟内存、文件系统、网络、其它……,
    • 应用程序
      常见的有Apache、MySQL、Nginx、Memcahed等。

    性能调优就是对计算机硬件、操作系统和应用有相当深入的了解,调节三者之间的关系,实现整个系统(包括硬件、操作系统、应用)的性能最大化。

    为什么需要性能调优?(why)

    场景一:当用户量达到一定数量时,应用就非常非常的慢。这时问老板能不能加机器。老板说,其他公司的服务也就一台服务器,别人行,我们为什么不行。坑我钱呢?(嘻嘻😁)

    场景二:同样的需求,100个人实现,有100种不同的写法。有秒级的,有100毫秒级,有10毫秒级的,有1毫秒级的。这就是菜鸟与高手的区别。通过性能调优,能让我们了解底层的实现。

    一、为了获得更好的系统性能(就是你现有的系统运行的还不错,但优化一下可以运行的更好)。
    二、通过性能调优来了解底层原理

    什么时候需要性能调优 (when)

    作为我们程序员时时刻刻都应该对自己写的代码负责,不让自己的代码成为应用的瓶颈。


    开个玩笑

    什么地方需要性能调优?(where)

    之前说来性能调优就是调节这些内容,包括硬件、操作系统、应用程序。那么调优地方当然是以下几点喽!

    • 硬件选型(根据服务器应用类型来选购服务器)
    • 操作系统调节系统参数
    • 组件 (Nginx、MySQL等)
    • 代码

    怎么样进行性能调优?(how)

    • 性能指标 –> 确认衡量标准
    • 性能测试 –> 验证性能指标
    • 性能分析 –> 找出性能瓶颈
    • 性能调优 –> 解决性能问题
    • 性能监控 –> 检验调优效果,重复第三步骤

    性能指标

    • 吞吐量
      是单位时间内完成的用户或系统的请求数量。
    • 并发数
      同时能接受多少用户的访问请求
    • 响应时间
      用户发出请求到收到响应的时间间隔。
    • 资源利用率
      机器操作系统的资源利用

    一般我们以上面的几个指标评定软件的性能。这几个指标又有相互的制约,而我们需要寻找这样一个各个指标都相对满意的点。

    响应时间--用户并发数

    响应时间--用户并发数

    响应时间一开始随着用户并发数的增加变化不大,当达到一个临界值时陡升

    吞吐量--用户并发数

    吞吐量--用户并发数

    吞吐量一开始随着用户并发数的增加线性增长,当达到一个临界值时吞吐量不在变化,再增加用户并发数吞吐量出现下降

    资源利用率--用户并发数

    资源利用率--用户并发数

    资源利用率一开始随着用户并发数的增加线性增长,当达到一个临界值时资源利用率达到饱和,不再变化

    以上三张图在做性能压测时能很好的体现(这里不讲性能测试)。

    硬件选型

    硬件选型是在有限的资源下(金钱),选择最适合自己应用运行的硬件基础。(如果你是土豪那无所谓,反正贵总是有好处的)。

    那么如何选择硬件呢?其实视自己在服务器上安装的应用或则组件决定。

    • 如果说是自己安装个简单的应用玩玩。那只需要购买能把应用跑起来,就差不多了。
    • 如果要安装个Mysql,那关注点是磁盘的转数,cpu普通的就行
    • 如果要安装个缓存,比方Memcache,那关注点是内存大小,cpu普通就行(缓存可能还需要好的网络,这个看你应用的瓶颈在哪)
    • 如果要安装个计算型的应用,那关注点是cpu,一般应用4G内存够了

    总的来说就是:应用或组件依赖什么,那么我们就多花点钱,配好的。也不需要富的流油,够用就行

    操作系统调节系统参数

    操作系统Linux、windows,这些为什么还要调优呢?因为操作系统不是为你而设计的,而是为大多数人设计的。它要适应大众,才能普及推广啊。
    服务器一般都是Linux操作系统,不过我对操作系统不是很熟。所以下面只讲我调节过的点。

    系统句柄

    Linux是有文件句柄限制的,一般都是1024,生产服务器用其实很容易就达到这个数量 是不是碰到过这些错误

    java.lang.OutOfMemoryError:Unable to create new native thread 
    Can’t open so many files 
    too many open files
    

    一个线程一个句柄,在高压情况下,线程数量超过了服务器的句柄限制

    • 查看当前使用的句柄数
    cat /proc/sys/fs/file-nr
    
    句柄数
    • 查看服务器句柄配置
    ulimit -n
    ulimit -a
    
    • 设置句柄数
    vi /etc/security/limits.conf
    *   soft noproc   65535  
    *   hard noproc   65535  
    *   soft nofile   65535  
    *   hard nofile   65535 
    说明:* 代表针对所有用户 
    noproc 是代表最大进程数 
    nofile 是代表最大文件打开数
    修改完重新登录就可以见到,使用 ulimit -a 查看确认
    

    交换区

    swap空间是一块磁盘空间,操作系统使用这块空间保存从内存中换出的操作系统不常用page数据,这样可以分配出更多的内存做page cache。页面频繁换入换出会产生IO读写、操作系统中断,这些都很影响系统的性能。

    所以在内存充足的情况下最好关闭

    swapoff -a
    

    组件

    组件是支称应用性能的关键,所以选组件、配置参数至关重要

    选组件

    在强大的开源社区下,不同部位的组件可以有很多种选择。比如缓存有memcache、redis、tair、aerospike等,看得我们是眼花缭乱。其实它们有不同的特性,我相信开发者不肯能重复的造轮子,它们各有各适合的场景。而你是以你所面临的场景去选择它们。

    以下是我选取组件的步骤

    1、清楚的了解自己所面临的场景
    2、根据场景抽取关键词,去google搜索。(因为自己的知识面不够广阔,不知道到底有哪些组件)
    3、去官网查看它们的优点缺点,特意把缺点标黑,最会踩坑的地方
    4、缩小组件范围
    5、动手基准测试,有些东西官网很能吹的
    6、深入了解

    不过公司已经大面积使用的情况下,是不容许你更换组件的。那么我们只能依从,更关注使用方式和参数配置上去调节。

    应用代码

    代码调优,网上有很多。但是能熟练掌握不是一件容易的事,需要自己去尝试(我也还在积累经验的阶段)。不过最近我发现思想上的改变很重要,下面讲一下思想上的进步

    首先我们要正视自己,我们现在处于什么阶段。我们需要脚踏实地,不要想着一开始就完美。我看过一本《程序员进阶攻略》把我思想洗脑了下


    image.png

    阶段

    以下三个阶段都是我们在开发上的流程,其实也是我们程序员的程度阶段。

    调试代码Debugging

    第一层含义:调试代码或者不熟悉API
    第二层含义:初入程序员行业,都是小心翼翼的。对自己写的代码不自信,需要不断的调试来纠正自己

    编写代码Coding

    第一层含义:编写业务代码
    第二层含义:能独自完成业务代码,在实现需求的情况下追求可读性、可维护性。

    运行代码Running

    第一层含义:运行代码
    第二层含义:在自己的脑袋中能运行程序,考虑到不同场景下的程序运行状况

    所以理解来自己在哪一个阶段,在看下下一个阶段的要求,再去追求。当达到了,在进行下一个目标。(怎么跟实现梦想一样啊,先分解目标)

    定位性能问题

    之前的话由于监控系统没有,都是自己敲命令查询(好心酸,后来我也给他们搞了个监控系统)。下图是主要的一些命令

    定位性能

    相关文章

      网友评论

        本文标题:性能调优

        本文链接:https://www.haomeiwen.com/subject/agtsqqtx.html