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

 

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

在高并发量的场景下磁盘IO往往是性能的瓶颈所在,访问日志涉及到频繁的写操作,所以这部分要尽可能地优化,不然将拖累系统的整体性能。针对文件记录及数据库记录两种方式可以有以下措施提高写性能,

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

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

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

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

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

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

性能调优之访问日志IO性能优化的更多相关文章

  1. OCM_第十五天课程:Section6 —》数据库性能调优 _SQL 访问建议 /SQL 性能分析器/配置基线模板/SQL 执行计划管理/实例限制

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  2. 性能调优3:硬盘IO性能

    数据库系统严重依赖服务器的资源:CPU,内存和硬盘IO,通常情况下,内存是数据的读写性能最高的存储介质,但是,内存的价格昂贵,这使得系统能够配置的内存容量受到限制,不能大规模用于数据存储:并且内存是易 ...

  3. 性能调优之Java系统级性能监控及优化

    性能调优之Java系统级性能监控及优化   对于性能调优而言,通常我们需要经过以下三个步骤:1,性能监控:2,性能剖析:3,性能调优 性能调优:通过分析影响Application性能问题根源,进行优化 ...

  4. Java性能调优:利用JFR生成性能日志

    Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JFR生成 ...

  5. Java性能调优:利用JMC分析性能

    Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JMC分析 ...

  6. 访问日志IO性能优化

    在高并发量的场景下磁盘IO往往是性能的瓶颈所在,访问日志涉及到频繁的写操作,所以这部分要尽可能地优化,不然将拖累系统的整体性能.针对文件记录及数据库记录两种方式可以有以下措施提高写性能, l 避免频繁 ...

  7. 性能调优 -- Java编程中的性能优化

    String作为我们使用最频繁的一种对象类型,其性能问题是最容易被忽略的.作为Java中重要的数据类型,是内存中占据空间比较大的一个对象.如何高效地使用字符串,可以帮助我们提升系统的整体性能. 现在, ...

  8. Redis性能调优:保存SNAPSHOT对性能的影响

    前一段时间.开发环境反馈,Redisserver訪问很慢,每一个请求要数秒时间,重新启动之后2~3天又会这样. 我查看了一下Linux的性能,没有什么问题. 通过 # redis-cli --late ...

  9. OCM_第十四天课程:Section6 —》数据库性能调优_各类索引 /调优工具使用/SQL 优化建议

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

随机推荐

  1. hadoop--安装1.2.1版本

    hadoop的安装分为三种方式,第一种单机安装,一般用于调试(其实一般都不用).第二种,伪分布式安装,一般程序员开发会使用这种方式.第三种,分布式安装,在实际环境中应用.今天在这里记下的是第二种,即伪 ...

  2. JavaScript 基本类型值-String类型

    ▓▓▓▓▓▓ 大致介绍 String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串.在JavaScript中没有单个的字符型,都是字符串.字符型就相当于只包含一个字符的字符串. ...

  3. 解析java泛型(一)

    对于我们java中的泛型,可能很多人知道怎么使用并且使用的还不错,但是我认为想要恰到好处的使用泛型,还是需要深入的了解一下它的各种概念和内部原理.本文将尽可能的囊括java泛型中的重要的概念.主要内容 ...

  4. python2.7读汉字的时候出现乱码,如何解决

    我使用的是window系统,安装Anaconda,所以用的是. 1.数据形式 2.读进来乱码 3.解决办法 3.1方法1 import pandas as pd #pd.read_csv('c:/us ...

  5. .net 爬虫技术

    关于爬虫 从搜索引擎开始,爬虫应该就出现了,爬的对象当然也就是网页URL,在很长一段时间内,爬虫所做的事情就是分析URL.下载WebServer返回的HTML.分析HTML内容.构建HTTP请求的模拟 ...

  6. HTML 5入门知识(三)

    <canvas>标签 在网页中使用canvas元素,像使用其他HTML标签一样简单,然后利用JavaScript脚本调用绘图API,绘制各种图形.canvas拥有多种绘制路径.矩形.圆形. ...

  7. 基于 socket.io, 简单实现多平台类似你猜我画 socket 数据传输

    一.前言 socket.io 实现了实时双向的基于事件的通讯机制,是基于 webSocket 的封装,但它不仅仅包括 webSocket,还对轮询(Polling)机制以及其它的实时通信方式封装成了通 ...

  8. TP框架 基础1

    php框架 一.真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难,代码风格 ...

  9. 1677: [Usaco2005 Jan]Sumsets 求和

    1677: [Usaco2005 Jan]Sumsets 求和 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 626  Solved: 348[Submi ...

  10. 485. Max Consecutive Ones

    题目 Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: ...