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

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

第一:Web网站调优html

一、尽量减小HTTP请求:图片合并 (css sprites),Js脚本文件合并、css文件合并。程序员

二、减小DNS查询web

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

四、压缩js和cssredis

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

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

这一条要灵活运用,把js和css提取出来放在外部文件的优势是:减小html体积,提升了js和css的复用性,提升往后的可维护性数据库

缺点:增长了http请求,不过这一点能够经过缓存来解决。后端

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

六、避免重定向

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

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

七、移除重复脚本

八、使用ajax缓存

ajax的get和post方法:

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

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

九、使用Gzip压缩

十、使用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相似。推荐。

如何调优?

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

上面这些调优工具都提供了强大的功能,可是总的来讲通常分为如下几类功能

堆信息查看

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

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

第一:Web网站调优

一、尽量减小HTTP请求:图片合并 (css sprites),Js脚本文件合并、css文件合并。

二、减小DNS查询

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

四、压缩js和css

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

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

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

缺点:增长了http请求,不过这一点能够经过缓存来解决。

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

六、避免重定向

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

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

七、移除重复脚本

八、使用ajax缓存

ajax的get和post方法:

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

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

九、使用Gzip压缩

十、使用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相似。推荐。

如何调优?

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

上面这些调优工具都提供了强大的功能,可是总的来讲通常分为如下几类功能

堆信息查看

可查看堆空间大小分配(年轻代、年老代、持久代分配)
性能优化基本是BAT等一线互联网公司程序员必备的技能,如下为你们完整揭晓性能完整的优化方案和方法:包含web网站调优、数据库、JVM调优、架构调优等方案。

第一:Web网站调优

一、尽量减小HTTP请求:图片合并 (css sprites),Js脚本文件合并、css文件合并。

二、减小DNS查询

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

四、压缩js和css

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

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

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

缺点:增长了http请求,不过这一点能够经过缓存来解决。

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

六、避免重定向

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

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

七、移除重复脚本

八、使用ajax缓存

ajax的get和post方法:

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

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

九、使用Gzip压缩

十、使用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相似。推荐。

如何调优?

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

上面这些调优工具都提供了强大的功能,可是总的来讲通常分为如下几类功能

堆信息查看

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

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

提供即时的垃圾回收功能

垃圾监控(长时间监控回收状况)
浅谈数据库、JVM、缓存、SQL等性能调优方法和原则

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

对象引用状况查看

有了堆信息查看方面的功能,咱们通常能够顺利解决如下问题:

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

--内存泄漏

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

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

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

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

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

死锁检查

热点分析

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

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

这两个东西对于系统优化颇有帮助。咱们能够根据找到的热点,有针对性的进行系统的瓶颈查找和进行系统优化,而不是漫无目的的进行全部代码的优化。

快照

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

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

内存泄漏检查

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

内存泄漏通常能够理解为系统资源(各方面的资源,堆、栈、线程等)在错误使用的状况下,致使使用完毕的资源没法回收(或没有回收),从而致使新的资源分配请求没法完成,引发系统错误。

内存泄漏对系统危害比较大,由于他能够直接致使系统的崩溃。

性能调优总结:

大型网站的性能瓶颈大部分瓶颈都在数据库端,因此性能调优老是沿着如何减小对后端的压力来操做,数据库端的瓶颈常常会形成应用端的雪崩(好比:sql查询过长,长事务)等,因此须要及时解决后端性能。

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

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

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

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

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

相关文章
相关标签/搜索