前几天和一个同学聊天。他说,“我们公司的系统从来没有做过性能调优,集成测试没问题就上线了,上线后几乎没有性能问题。”我当时没给他打电话。因为没有遇到性能问题,不代表程序没有性能问题,只是系统访问量有点小。你有印象吗?每次明星爆出一个大瓜,微博就挂了。那是因为在短时间内访问量突然增加之后,他们承受不住压力,出现了性能瓶颈。大多数性能问题是由于访问过多造成的。记得汪峰在京东做过直播,画面卡顿,几乎无法下单,画面无法显示。因为京东之前没做过直播,也没遇到过这么大的访问量,估计活动过后,直播的发展会被诟病不少。还有一些性能问题会随着时间的推移而累积和爆发。程序在服务器上运行一段时间后需要重启,否则某个时候节点内存会突然爆掉。反正我们公司的一些项目就遇到过这方面的尴尬。最初的解决办法是写个脚本,在夜深人静的时候,偷偷重启释放内存。在性能方面,我觉得12306是要求最高的。说不定会被全国人骂。在苏州的时候,不管是不是放假,每次坐火车回洛阳,或者从洛阳到苏州,都觉得身边有那么多同伴。为什么这么多人坐火车,不是南就是北,东就是西。春运期间,12306的压力可想而知,秒杀活动根本无法与之相提并论。如果有朋友在12306工作过,可以吹一辈子。你比做过淘宝双十一的人厉害10000倍(好吧,我先给你吹牛,据说12306访问峰值10亿PV,??很BT)。知道了性能调优的重要性之后,请问小伙伴们,什么时候介入性能调优比较好?如果你的答案是“越快越好”,那显然是错误的答案。我在上一篇文章中提到的软件开发原则之一是“完成胜于完美”,因为“完美永远不会完成”。性能调优是一场持久战,早点介入并不是好事。想一想,系统第一次上线才是最重要的。否则,如果你一边想着性能调优,一边厌倦了开发进度,很可能无法两全其美,拖累系统开发的进度。当你的系统上线时,用户可能已经被其他系统抢走了,你永远没有优化性能的机会。不要总想着把所有的功能都完善,完善了再上线。产品有了一定的原型就应该马上上线试错。根据用户反馈和市场需求,考虑是否增加一些其他功能或优化。那我再问问小伙伴们,哪些因素会成为系统的性能瓶颈呢?闭上眼睛,转身,想一想。数据库:几乎所有的系统都会用到数据库,大量的数据库读写操作会严重影响系统的性能,因此数据库缓存技术Redis变得越来越重要。另外,系统运行时间长了之后,数据量会变得非常大,不仅需要在SQL上做大量的优化,还要在分库分表上下功夫。网络:如果你家的网速很慢,问问你的运营商你家有多少带宽。或者,至少检查一下,你的网线是100M的还是千兆的,虽然网线很短,到路由器跟猫一样短。如果网络带宽太小,意味着数据传输很慢,就像跑车开到市区,可能还没有自行车快。磁盘:我家的台式机都换成了固态硬盘,更换后的速度比普通硬盘快很多。说多了,数据库的读写操作就是磁盘I/O,Redis之所以快,是因为Redis是对内存进行操作的,但是Redis的牛逼之处在于它不仅可以缓存,还可以持久化数据到磁盘。内存:内存的读写速度比磁盘快很多,但空间却远小于磁盘。一般家用电脑内存16G已经是很高的配置了。众所周知,Java程序通过JVM分配内存,创建的对象放在堆内存上,运行起来非常快,但是如果代码写错了,很容易造成内存溢出。CPU:CPU的计算速度超乎人类的想象,所以AlphaGo可以轻松战胜柯洁。如果,我真的是说如果,在CPU或者奔腾时代,柯洁还能轻松打败AlphaGo。如果程序涉及到大量的上下文切换,或者导致JVM频繁的GC,很容易长时间占用CPU,导致性能问题。在实际工作中,小伙伴们也可以按照上面的顺序进行性能调优。一开始不要盲目从内存和CPU入手,这个有点难度,而且效果不明显;如果做得不好,也会影响整个系统的使用。先从数据库、网络和磁盘优化入手,很容易看到效果,也不容易出错。最后一个问题,你知道系统的性能指标吗?1)响应时间很多年前,我做了一件很蠢的事。公司有一台闲置的云服务器,是WindowsServer版的。正好一个客户想体验一下我们的系统,所以我也没有想太多,就把系统部署到了这台云服务器上。结果?首页打开超级慢,慢到将近一分钟。不仅客户的下巴掉了下来,我的也一样。为了面子,我在首页相关的后台和前端做了很多优化。后端特意使用缓存技术,减少SQL语句的查询;前端压缩了JavaScript和CSS以减少请求数,甚至取代了CDN。使用了延迟加载图像,但收效甚微。终于,我静下心来想了想。同样的代码,在linux环境下部署的系统速度非常快。即使是第一次打开首页,需要加载资源,响应时间还是短得让人无法察觉。于是我把WindowsServer重装进了CentOS,效果立竿见影,响应时间短的离谱。那么,一个系统的性能好不好,响应时间(指系统响应请求的时间,比如用户打开首页)是最明显的直观指标。对于游戏来说,不到100毫秒的响应时间还算不错,1秒左右的响应时间勉强可以接受。如果响应时间达到3秒,则无法播放。2)吞吐量吞吐量(TransactionPerSecond)是指系统在单位时间内处理的交易数量。一个事务可能包含多个请求,这反映了系统的压力。需要注意的是TPS和QPS是不一样的。后者是指单位时间内的请求数。当用户的操作只有一个请求接口时,TPS和QPS没有区别。吞吐量可以细分为网络吞吐量和磁盘吞吐量。前者是指在某一时刻网络中两个节点之间提供给网络应用的剩余带宽。即设备在不丢帧的情况下可以接受的最大速率。后者是指系统在单位时间内可以处理的I/O请求数。I/O请求通常是读写数据操作请求,重点是随机读写性能。最后简单总结一下。性能调优非常重要。不仅用户体验好,系统稳定,更能体现出真正优秀的编码水平。相信所有的小伙伴都能写出运行流畅的代码,但是至于痛快不痛快,就需要从性能上去研究了。换句话说,如果你跳槽到一家公司,刚好解决了原来系统的性能瓶颈,就厉害了,兄弟,马上就会被公司重用!按照下面的二维码进行操作。转载本文请联系沉默王二公众号。加油,骚年!
