浅谈数据库、JVM、缓存、SQL等性能调优方法和原则

2023-06-09 0 861

操控性强化基本上是BAT等第三线网络公司开发人员必不可少的专业技能,下列为我们完备出炉操控性完备的强化计划和方式:包涵web中文网站Listary、资料库、JVMListary、构架Listary等计划。

第三:Web中文网站Listary

1、尽可能减少HTTP允诺:相片分拆 (css sprites),JsJAVA文档分拆、css文档分拆。

2、减少DNS查阅

3、将css放到网页最下面,将js放到网页最下面

4、填充js和css

减少文档表面积,除去无谓的空白符、文件格式符、注解(即对标识符进行序列化)

5、把js和css抽取出放到内部文档中

这两条要充分运用,把js和css抽取出放到内部文档的缺点是:减少html表面积,提升了js和css的F83E43Se性,提升尔后的可移植性

缺点:减少了http允诺,但是这一点儿能透过内存来化解。

什么情形下将js和css写在网页内呢,能分成三种情形:js和css标识符较为少;这个网页不怎么会出访

6、防止链接

链接就是采用者允诺的网页被迁移到了别的地方性,应用程序向服务项目请允诺两个网页,伺服器说应用程序允诺的网页已经被迁移到除此之外两个网页,并知会另两个网页门牌号,应用程序就再推送允诺到链接的门牌号。这种会减少伺服器和应用程序间的来往单次,负面影响中文网站操控性。

重定向状况码有:301永久性链接 302临时性链接。304 not modified 并不是吗链接,它是用以说应用程序get允诺的文档在内存中,防止再次浏览。

7、除去多次重复JAVA

8、采用ajax内存

ajax的get和post方式:

只要是应用程序的get允诺,应用程序都会采用内存,对于同一门牌号的允诺,伺服器会推送304状况码到应用程序,应用程序就会采用内存中的数据

post的允诺每次都会被执行,应用程序不会内存

9、采用Gzip填充

10、采用CDN(内容分发网络)

第二:资料库Listary

资料库的Listary,总的来说分成下列三部分:

1.SQLListary:主要集中在索引、减少跨表与大数据join查阅等。

2.资料库端构架设计强化:

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

3.连接池Listary

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

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

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

选型考虑

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

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

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

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

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

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

第四:数据允诺改造为异步

采用场景

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

常见做法

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

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

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

第五:JVMListary

什么时候调?

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

Listary工具:

Jconsole,jProfile,VisualVM

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

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

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

如何Listary?

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

下面这些Listary工具都提供了强大的功能,但是总的来说一般分成下列几类功能

堆信息查看

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

浅谈数据库、JVM、缓存、SQL等性能调优方法和原则

提供即时的垃圾回收功能

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

浅谈数据库、JVM、缓存、SQL等性能调优方法和原则

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

对象引用情形查看

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

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

–内存泄漏

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

线程监控

浅谈数据库、JVM、缓存、SQL等性能调优方法和原则

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

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

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

死锁检查

热点分析

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

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

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

快照

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

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

内存泄漏检查

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

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

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

操控性Listary总结:

大型中文网站的操控性瓶颈大部分瓶颈都在资料库端,所以操控性Listary总是沿着如何减少对后端的压力来操作,资料库端的瓶颈经常会造成应用端的雪崩(比如:sql查阅过长,长事务)等,所以需要及时化解后端操控性。

1.透过读写分离、垂直拆分、水平拆分降低对资料库后端的压力。

2.透过强化sql语句,索引等,缩短对sql的查阅时间。

2.透过内存以及CDN来化解对相片、文档等的读操作,防止对资料库产生压力。

3.透过对web端的强化,js、css等填充,提升大文档读取时间,尽量依赖CDN。

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

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务