性能调优
本来这次要写支付相关的话题,主要是这周是我分享,所以就来说说我上一家公司做的事吧
上一家公司同盾,做的一件事就是风控。哪有风险,哪就有风控。风控是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
第一层含义:运行代码
第二层含义:在自己的脑袋中能运行程序,考虑到不同场景下的程序运行状况
所以理解来自己在哪一个阶段,在看下下一个阶段的要求,再去追求。当达到了,在进行下一个目标。(怎么跟实现梦想一样啊,先分解目标)
定位性能问题
定位性能之前的话由于监控系统没有,都是自己敲命令查询(好心酸,后来我也给他们搞了个监控系统)。下图是主要的一些命令