性能调优

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

上一家公司同盾,做的一件事就是风控。哪有风险,哪就有风控。风控是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

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

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

定位性能问题

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

定位性能

你可能感兴趣的:(性能调优)