性能调优之访问日志IO性能优化 性能调优之访问日志IO性能优化

性能调优之访问日志IO性能优化

 

poptest是国内惟一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工做为目标。若是对课程感兴趣,请你们咨询qq:908821478,咨询电话010-84505200。html

在高并发量的场景下磁盘IO每每是性能的瓶颈所在,访问日志涉及到频繁的写操做,因此这部分要尽量地优化,否则将拖累系统的总体性能。针对文件记录及数据库记录两种方式能够有如下措施提升写性能,数据库

避免频繁的打开关闭文件。将日志写入文件的通常操做步骤是打开-写入-关闭,但假如在须要频繁写入日志的场景下,这种方式在性能上确定会存在问题,由于每次打开关闭都是须要成本开销的,因此必需要想一想是否有别的更好的方式,居然问题出如今打开关闭的次数,那么解决问题思路就从这里下手,能够在第一次打开写入日志后不进行关闭操做,保持打开的状态,下一次写入则无需再次打开可直接写入。而因为实际过程当中访问日志产生的量很是大,确定不可能只往一个文件中写入数据,可能会按时间间隔天天写一个文件或按文件大小每50M写一个文件,因此在实际设计中会涉及到更换文件的操做,更换时须要把原来的文件流关闭。经过上述措施避免了文件频繁的打开关闭操做,但它同时也存在一些缺点,文件流不关闭会一直占用操做系统资源,且若是不及时关闭可能在程序运行过程当中发生异常未正确处理而致使文件流未能关闭,进而将会致使内存泄漏。性能优化

添加缓冲区:添加缓冲区的做用简单地说应该是减小文件真实写入磁盘的次数,通常将文件写入的方式是每执行一次写入操做就把这次须要写入的数据写入磁盘介质中,而缓冲区模式则是把要写入的数据先写入内存中,当缓冲区内存量达到必定程度才写入磁盘,因此添加了缓冲区的文件操做并不是每次写入都是存储介质中,缓冲区对于IO操做是一个十分重要的概念,缓冲区具体的实现能够参考我前面相关的章节,固然jdk已经提供了相关的缓冲类并不用咱们重复制造轮子。缓冲区的添加无疑提升了操做性能,但它一样存在缺点,它没法百分之百保证全部数据都成功记录到存储介质中,可能在系统发生意外时致使缓冲区没法写入文件,而丢失的仅仅是缓冲区的数据。多线程

利用“池”技术优化链接避免每次建立链接,池技术更多的是针对以数据库作为存储端的方案,便是咱们最熟悉的链接池了,JDBC每次建立链接都须要很大的成本开销,若是每次写入都从新创建链接这对系统来讲简直没法忍受,因而能够在系统初始化时就建立一个链接池,池内包含了不少创建好的链接,每次使用时只需往池里取出,使用完不关闭链接而是把链接从新放回池里便可。此种方式的好处显而易见,操做性能大大地提升,而若是真要说有哪些缺点的话估计只能说链接池须要占用一些操做系统资源,即便没有被使用。但对于如今的机器这点成本消耗基本能够忽略不计。并发

优化锁竞争,首先,在一个高并发的场景中日志的写入确定是多线程的,多线程的使用在提升系统性能的做用是毋庸置疑的;其次,居然在文件流的写入操做是多线程的,那必然涉及到锁竞争的问题,由于若是没有锁的保护文件可能被写得乱七八糟且正确性没法获得保证,因此线程必定是在写入前先尝试竞争写入锁,只有成功获取锁的线程才能执行写入操做,一旦写完就释放锁;最后,这种锁的竞争跟JDK的实现及JVM的实现相关,多是全部竞争的线程采用自旋方式获取锁,也多是采用线程挂起方式,对于自旋方式及挂起方式在不一样场景有各自的优点,线程自旋模式可能会消耗资源,一样挂起恢复也可能会消耗资源,在实际使用中可经过性能测试比较决定使用哪一种方式。在JDK的自带的并发包是先尝试自旋获取,若干次失败后进行挂起操做。异步

考虑使用非阻塞模式,所谓非阻塞(NIO)是指在进行IO操做时当执行写入操做时不等待执行结果而是直接放弃对CPU的使用,这种模式基于事件驱动,不一样的事件由某一或若干线程处理,在实际中NIO模式被证明在某些场景中是性能提高的利器。它的惟一缺点估计是让你程序变得更加复杂。高并发

使用异步IO,异步IO(AIO)是JDK1.7后提供的一种新IO模式,它主要是针对CPU的优化,是CPU级别的优化尝试,在实际中使用须要对系统使用场景作性能测试对比再决定是否进行AIO改造。工具

相关文章
相关标签/搜索