性能调优之访问日志IO性能优化
性能调优之访问日志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性能优化的更多相关文章
- OCM_第十五天课程:Section6 —》数据库性能调优 _SQL 访问建议 /SQL 性能分析器/配置基线模板/SQL 执行计划管理/实例限制
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
- 性能调优3:硬盘IO性能
数据库系统严重依赖服务器的资源:CPU,内存和硬盘IO,通常情况下,内存是数据的读写性能最高的存储介质,但是,内存的价格昂贵,这使得系统能够配置的内存容量受到限制,不能大规模用于数据存储:并且内存是易 ...
- 性能调优之Java系统级性能监控及优化
性能调优之Java系统级性能监控及优化 对于性能调优而言,通常我们需要经过以下三个步骤:1,性能监控:2,性能剖析:3,性能调优 性能调优:通过分析影响Application性能问题根源,进行优化 ...
- Java性能调优:利用JFR生成性能日志
Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JFR生成 ...
- Java性能调优:利用JMC分析性能
Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JMC分析 ...
- 访问日志IO性能优化
在高并发量的场景下磁盘IO往往是性能的瓶颈所在,访问日志涉及到频繁的写操作,所以这部分要尽可能地优化,不然将拖累系统的整体性能.针对文件记录及数据库记录两种方式可以有以下措施提高写性能, l 避免频繁 ...
- 性能调优 -- Java编程中的性能优化
String作为我们使用最频繁的一种对象类型,其性能问题是最容易被忽略的.作为Java中重要的数据类型,是内存中占据空间比较大的一个对象.如何高效地使用字符串,可以帮助我们提升系统的整体性能. 现在, ...
- Redis性能调优:保存SNAPSHOT对性能的影响
前一段时间.开发环境反馈,Redisserver訪问很慢,每一个请求要数秒时间,重新启动之后2~3天又会这样. 我查看了一下Linux的性能,没有什么问题. 通过 # redis-cli --late ...
- OCM_第十四天课程:Section6 —》数据库性能调优_各类索引 /调优工具使用/SQL 优化建议
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
随机推荐
- [hadoop] - Container [xxxx] is running beyond physical/virtual memory limits.
当运行mapreduce的时候,有时候会出现异常信息,提示物理内存或者虚拟内存超出限制,默认情况下:虚拟内存是物理内存的2.1倍.异常信息类似如下: Container [pid=13026,cont ...
- 360随身wifi无法使用临时解决方案大全
360随身wifi在绝大多数情况下都是可以正常使用的,但在极少数系统或网络环境下可能会出现异常,如系统服务缺失.公司网络限制.少数校园网客户端限制等等: 360攻城师正在积极努力解决 ...
- Git学习之路(6)- 分支操作
▓▓▓▓▓▓ 大致介绍 几乎所有的版本控制系统都会支持分支操作,分支可以让你在不影响开发主线的情况下,随心所欲的实现你的想法,但是在大多数的版本控制系统中,这个过程的效率是非常低的.就比如我在没有学习 ...
- 几分钟看完 flow.ci 全部功能
从 0 到 1,从邀请式内测到收费上线,flow.ci 经历了十个多月的沉淀与打磨.这期间,flow.ci 工程师们奋力赶工,进行了一系列的大功能更新,Bug 修复,功能优化. 这篇文章记录了 flo ...
- Jsp注册界面——request对象
1. Reg.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...
- SQL SERVER的事务日志
1 基本介绍 每个数据库都具有事务日志,用于记录所有事物以及每个事物对数据库所作的操作. 日志的记录形式需要根据数据库的恢复模式来确定,数据库恢复模式有三种: 完整模式,完全记录事物日志,需要定期进行 ...
- SQL SERVER的检查点checkpoint
1 什么是检查点 数据修改操作 都是在 内存中的数据页进行修改,每次修改后并没有立即把这些页面写入磁盘,而是等到一定时期,数据库引擎对数据库发起 检查点命令,这时,该命令就会创建一个已知的正常点,把当 ...
- 微信公众平台开发-access_token获取及应用(含源码)
微信公众平台开发-access_token获取及应用(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 很多系统中都有access_token参数,对于微信公众平台的access_to ...
- 对JavaScript中变量类型的重新理解
<JavaScript启示录>这本书中提出:JavaScript中,对象为“王”(JavaScript里的几乎所有东西都是对象或者用起来像对象). 飞燕草对JavaScript最深刻的理解 ...
- linux网络编程1 最简单的socket编程
下面是socket编程的服务器端 先看一个图,1 #include<stdio.h> #include<stdlib.h> #include<string.h> # ...