阿里P8架构师谈:数据库、JVM、缓存、SQL等性能调优方法和原则

编辑

阿里P8架构师谈:数据库、JVM、缓存、SQL等性能调优方法和原则

性能优化基本是BAT等一线互联网公司程序员必备的技能,以下为大家完整揭晓性能完整的优化方案和方法:包含web网站调优、数据库、JVM调优、架构调优等方案。

第一:Web网站调优

1、尽可能减少HTTP请求:图片合并 (css sprites),Js脚本文件合并、css文件合并。

2、减少DNS查询

3、将css放在页面最上面,将js放在页面最下面

4、压缩js和css

减少文件体积,去除不必要的空白符、格式符、注释(即对代码进行格式化)

5、把js和css提取出来放在外部文件中

这一条要灵活运用,把js和css提取出来放在外部文件的优点是:减少html体积,提高了js和css的复用性,提高日后的可维护性

缺点:增加了http请求,不过这一点可以通过缓存来解决。

什么情况下将js和css写在页面内呢,可以分为几种情况:js和css代码比较少;这个页面不怎么会访问

6、避免重定向

重定向就是用户请求的页面被转移到了别的地方,浏览器向服务请请求一个页面,服务器告诉浏览器请求的页面已经被转移到另外一个页面,并告知另一个页面地址,浏览器就再发送请求到重定向的地址。这样会增加服务器和浏览器之间的往返次数,影响网站性能。

重定向状态码有:301永久重定向 302临时重定向。304 not modified 并不是真的重定向,它是用来告诉浏览器get请求的文件在缓存中,避免重新下载。

7、移除重复脚本

9、使用ajax缓存

ajax的get和post方法:

只要是浏览器的get请求,浏览器都会使用缓存,对于同一地址的请求,服务器会发送304状态码到浏览器,浏览器就会使用缓存中的数据

post的请求每次都会被执行,浏览器不会缓存

10、使用Gzip压缩

11、使用CDN(内容分发网络)

第二:数据库调优

数据库的调优,总的来说分为以下三部分:

1.SQL调优:主要集中在索引、减少跨表与大数据join查询等。

2.数据库端架构设计优化:

通过读写分离调整对数据库的写操作,通过垂直拆分以及水平拆分(分库分表)来解决数据库端连接池瓶颈等问题。

3.连接池调优

可以通过熟悉连接池的原理,以及具体的连接池监控数据,来不断调试出最终的连接池参数。

第三:通过缓存减少后端压力

目前分布式缓存已经比较成熟,常见的有redis、memcached以及开源的淘宝分布式tair等。

选型考虑

如果数据量小,并且不会频繁地增长又清空(这会导致频繁地垃圾回收),那么可以选择本地缓存。具体的话,如果需要一些策略的支持(比如缓存满的逐出策略),可以考虑Ehcache;如不需要,可以考虑HashMap;如需要考虑多线程并发的场景,可以考虑ConcurentHashMap。

缓存是否会满,缓存满了怎么办?

对于一个缓存服务,理论上来说,随着缓存数据的日益增多,在容量有限的情况下,缓存肯定有一天会满的。如何应对?

① 给缓存服务,选择合适的缓存逐出算法,比如最常见的LRU。

② 针对当前设置的容量,设置适当的警戒值,比如10G的缓存,当缓存数据达到8G的时候,就开始发出报警,提前排查问题或者扩容。

③ 给一些没有必要长期保存的key,尽量设置过期时间。

第四:数据请求改造为异步

使用场景

用户并不关心或者用户不需要立即拿到这些事情的处理结果,这种情况就比较适合用异步的方式处理,这里的原则就是能异步就异步。

常见做法

一种做法,是额外开辟线程,这里可以采用额外开辟一个线程或者使用线程池的做法,在IO线程(处理请求响应)之外的线程来处理相应的任务,在IO线程中让response先返回。

如果异步线程处理的任务设计的数据量非常巨大,那么可以引入阻塞队列BlockingQueue作进一步的优化。具体做法是让一批异步线程不断地往阻塞队列里扔数据,然后额外起一个处理线程,循环批量从队列里拿预设大小的一批数据,来进行批处理(比如发一个批量的远程服务请求),这样进一步提高了性能。

另一种做法,是使用消息队列(MQ)中间件服务,MQ天生就是异步的。

第五:JVM调优

什么时候调?

通过监控系统对一些机器关键指标(gc time、gc count、各个分代的内存大小变化、机器的Load值与CPU使用率、JVM的线程数等)的监控报警,也可以看gc log和jstat等命令的输出,再结合线上JVM进程服务的一些关键接口的性能数据和请求体验,基本上就能定位出当前的JVM是否有问题,以及是否需要调优。

调优工具:

Jconsole,jProfile,VisualVM

Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。详细说明参考这里

JProfiler:商业软件,需要付费。功能强大。详细说明参考这里

VisualVM:JDK自带,功能强大,与JProfiler类似。推荐。

如何调优?

观察内存释放情况、集合类检查、对象树

上面这些调优工具都提供了强大的功能,但是总的来说一般分为以下几类功能

堆信息查看

可查看堆空间大小分配(年轻代、年老代、持久代分配)

阿里P8架构师谈:数据库、JVM、缓存、SQL等性能调优方法和原则

编辑

提供即时的垃圾回收功能

垃圾监控(长时间监控回收情况)

阿里P8架构师谈:数据库、JVM、缓存、SQL等性能调优方法和原则

编辑

请点击输入图片描述

查看堆内类、对象信息查看:数量、类型等

对象引用情况查看

有了堆信息查看方面的功能,我们一般可以顺利解决以下问题:

–年老代年轻代大小划分是否合理

–内存泄漏

–垃圾回收算法设置是否合理

线程监控

阿里P8架构师谈:数据库、JVM、缓存、SQL等性能调优方法和原则

编辑

线程信息监控:系统线程数量。

线程状态监控:各个线程都处在什么样的状态下

Dump线程详细信息:查看线程内部运行情况

死锁检查

热点分析

CPU热点:检查系统哪些方法占用的大量CPU时间

内存热点:检查哪些对象在系统中数量最大(一定时间内存活对象和销毁对象一起统计)

这两个东西对于系统优化很有帮助。我们可以根据找到的热点,有针对性的进行系统的瓶颈查找和进行系统优化,而不是漫无目的的进行所有代码的优化。

快照

快照是系统运行到某一时刻的一个定格。在我们进行调优的时候,不可能用眼睛去跟踪所有系统变化,依赖快照功能,我们就可以进行系统两个不同运行时刻,对象(或类、线程等)的不同,以便快速找到问题

举例说,我要检查系统进行垃圾回收以后,是否还有该收回的对象被遗漏下来的了。那么,我可以在进行垃圾回收前后,分别进行一次堆情况的快照,然后对比两次快照的对象情况。

内存泄漏检查

内存泄漏是比较常见的问题,而且解决方法也比较通用,这里可以重点说一下,而线程、热点方面的问题则是具体问题具体分析了。

内存泄漏一般可以理解为系统资源(各方面的资源,堆、栈、线程等)在错误使用的情况下,导致使用完毕的资源无法回收(或没有回收),从而导致新的资源分配请求无法完成,引起系统错误。

内存泄漏对系统危害比较大,因为他可以直接导致系统的崩溃。

性能调优总结:

大型网站的性能瓶颈大部分瓶颈都在数据库端,所以性能调优总是沿着如何减少对后端的压力来操作,数据库端的瓶颈经常会造成应用端的雪崩(比如:sql查询过长,长事务)等,所以需要及时解决后端性能。

1.通过读写分离、垂直拆分、水平拆分降低对数据库后端的压力。

2.通过优化sql语句,索引等,缩短对sql的查询时间。

2.通过缓存以及CDN来解决对图片、文件等的读操作,避免对数据库产生压力。

3.通过对web端的优化,js、css等压缩,提高大文件读取时间,尽量依赖CDN。

4.还有一个重点就是监控:对JVM、线程、sql查询时间等健康指标就行及时监控,通过监控及时发现瓶颈,及时优化。

优知学院 (youzhixueyuan.com ) IT人升职加薪进阶站,BAT总监经验分享平台。分享BAT:面试题目、架构师、CTO进阶干货!

阿里P8架构师谈:数据库、JVM、缓存、SQL等性能调优方法和原则

编辑


money.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

知乎招聘搜索算法实习生!邀你共建知乎搜索引擎!

星标/置顶小屋,带你解锁最萌最前沿的NLP、搜索与推荐技术部门介绍搜索算法团队是知乎核心算法团队之一,负责知乎搜索框背后的各项算法工作。我们团队一直非常重视新技术在搜索场景的探索和落地,包括但不限于 NLP,排序,…

论文浅尝 | 主题感知的问答生成

Citation: XingC, Wu W, Wu Y, et al. Topic aware neural response generation[C]//Thirty-FirstAAAI Conference on Artificial Intelligence. 2017.动机人机对话在 AI 和 NLP 领域是一项具有挑战性的工作。现存的对话系统包括任务导向的对话系统和非任务导向的聊天机器人。在…

.halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

尊敬的读者: 网络安全是当今数字时代的一大挑战,各种勒索病毒如.halo病毒层出不穷,对用户和企业的数据安全构成了严重威胁。本文将介绍.halo勒索病毒,以及如何恢复被其加密的数据文件,同时提供预防措施。在面对被勒索…

阿里P8架构师谈:多线程、架构、异步消息、Redis等性能优化策略

常见性能优化策略分类 1.代码 之所以把代码放到第一位,是因为这一点最容易引起技术人员的忽视。很多技术人员拿到一个性能优化的需求以后,言必称缓存、异步、JVM等。实际上,第一步就应该是分析相关的代码,找出相应的瓶颈&#xf…

周志华教授专著《集成学习:基础与算法》上市,豆瓣满分森林书破解AI实践难题...

近年来,机器学习技术的快速发展推动了语音、自然语言处理、机器视觉等多个领域获得巨大进步,也带动了人工智能相关产业的蓬勃发展。回顾机器学习最近30 年的发展历程,各种学习方法推陈出新、不断演进。但是,在此历程中&#xff0c…

Redis常用数据类型的数据结构

文章目录1. Redis 数据库介绍2. 列表(list)3. 字典(hash)4. 集合(set)5. 有序集合(sortedset)6. 数据结构持久化7. 总结1. Redis 数据库介绍 Redis 是一种键值( Key-Val…

论文浅尝 | 使用循环神经网络的联合事件抽取

余博涛,南京大学计算机科学与技术系,硕士研究生论文连接:http://www.aclweb.org/anthology/N16-1034发表会议:NAACL-HLT 2016摘要事件抽取(event extraction)是信息抽取中一个特别具有挑战性的问题。针对该…

阿里P8架构师谈:Web前端、应用服务器、数据库SQL等性能优化总结

web前端性能优化 Web前端指网站业务逻辑之前的部分,包括: 1.浏览器加载 2.网站视图模型 3.图片服务 4.CDN服务等 主要优化手段有优化浏览器访问,使用反向代理,CDN等。 1.浏览器访问优化 (1)减少http…

动手做个DialoGPT:生成式多轮对话模型

文 | 苏剑林编 | 兔子酱前段时间刷Arixv的时候,发现清华大学开源了一个大规模的中文闲聊语料库LCCC,从开源的文件上来看,这可能是目前开源的数量最大、质量最好的闲聊语料库了,而且还包含了部分多轮对话聊天,总的来说可…

搜索引擎背后的数据结构和算法

文章目录1. 整体系统介绍2. 搜集2.1 待爬取网页链接文件:links.bin2.2 网页判重文件:bloom_filter.bin2.3 原始网页存储文件:doc_raw.bin2.4 网页链接及其编号的对应文件:doc_id.bin3. 分析3.1 抽取网页文本信息3.2 分词并创建临时…

论文浅尝 | DKN: 面向新闻推荐的深度知识感知网络

笔记整理:仲亮靓,东南大学硕士研究生,研究方向是基于知识图谱的推荐系统动机新闻文本的语言非常凝练,其中包含了很多实体和常识知识。但目前的新闻个性化推荐方法都没有利用这些外部知识,也没有使用新闻之间潜在的知识…

聊聊工业界做机器学习的里程碑

文 | 吴海波编 | YY阅读说明,本文的机器学习领域限制于互联网搜索、推荐、广告场景,仅限于个人观点。2017年,我和团队的几个核心去了趟北京,找了各大互联网公司一线实战的同学,交流各自在机器学习上的经验。这次交流让…

直通BAT JVM必考题:Minor GC、Major GC、Full GC的区别

Java面试过程,JVM属于必考题系列: 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置 直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结 直通BAT必考题系列:7种JVM垃圾收集器特点,优…

matplotlib绘制多张图、多子图、多例图

绘制多图 关键: fig plt.figure(1) 表示新建第几个图 import matplotlib.pyplot as pltfig plt.figure(1) plt_rec_loss [1,2,3,4,5,6] plt_rec_recall [4,3,6,5,8,9] plt.xlabel("epoch") plt.ylabel("loss") plt.plot(range(len(plt_re…

jieba分词并做分析

Github:结巴分词地址 https://github.com/fxsjy/jieba 几种分词方法的简单使用:一 . jieba安装、示例 pip install jieba,jieba分词的语料是基于人民日报。分词示例1 import jieba 2 3 str1 江州市长江大桥 4 word_object jieba.cut(s…

研讨会 | CCF TF 第 17 期:认知计算产业化落地

CCF TF 技术前线只为技术专家CCFTF第17期主题 认知计算产业化落地2019年05月11日上海斯波特酒店五楼(上海市南丹路15号,徐汇区政府对面)人类迈入人工智能时代,技术的发展使得机器可以从大数据中提取信息,串联成知识&a…

短网址系统

文章目录1. 短网址服务整体介绍2. 如何通过哈希算法生成短网址?2.1 如何让短网址更短2.2 如何解决哈希冲突?2.3 如何优化哈希算法生成短网址的性能?3. 如何通过ID生成器生成短网址?3.1 相同的原始网址可能会对应不同的短网址3.2 如…

一个神经元的价值和一个神经病的坚持

作者 | 周博磊来源 | 机器之心一个神经元能够催生多少故事?香港中文大学信息工程系助理教授周博磊近日撰文介绍了他自 2015 年开始至今对神经元的研究经历。最近,他与 David Bau、朱俊彦等人合作的神经元研究论文发表在了 PNAS 杂志上。以下是周博磊的原…

直通BAT必考题系列:深入剖析JVM之G1收集器、及回收流程、与推荐用例

金三银四马上到了,即将进入面试的高峰期。在BAT面试中,JVM基本都是必考的系列。你至少需要掌握JVM内存模型与JVM参数详细配置,JVM的4种垃圾回收算法、垃圾回收机制与总结,以及今天重点谈到的JVM垃圾回收算法的实现:JVM…

多任务学习方法

最近一直在做多任务,但是效果好象没什么提升,因为都是凭自己的想法和感觉在做。于是上网查找了一些这方面的资料,寻求一些理论上的支撑和前人经验上的帮助。 多任务学习: 故名思意,就是多个任务一起学习。为什么要进行…