`

转:调整resin的resin.conf优化access-log输出日志

阅读更多
调整resin的resin.conf优化access-log输出日志
作者:lizongbo 发表于:00:25. 星期三, 二月 18th, 2009
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明。
http://618119.com/archives/2009/02/18/135.html
目前服务器上resin.conf的日志配置一般是:
《stdout -log path=”log/stdout.log” timestamp=”[%Y-%m-%d %H:%M:%S] ” rollover-size=”200mb” /》
《stderr -log path=”log/stderr.log” timestamp=”[%Y-%m-%d %H:%M:%S] ” rollover-size=”200mb” /》
《access -log path=”logs/access.log” rollover-period=”1D” rollover-size=”200mb”/》

在这种情况下,日志始终是先输出到logs/access.log这样的固定文件里,待文件大小满200M的时候,resin先锁住所有写日志操作,将文件的内容复制到文件名带时间戳的文件里,再清空当前日志文件的内容。
这种情况下,既多增加了磁盘io操作,也因为锁机制导致线程容易满,以至resin被webapp监控重启。
以前出现该问题的时候,只简单的通过关闭access-log绕了过去,而最近web网站的resin也出现了重启,
由于web是lvs负载均衡,因此不能通过关闭accesslog来解决问题。

经过查看resin的源代码分析,结合现在业务的实际情况,可以通过调整日志的配置为按时间周期切割来解决问题。
通过分析和实验,将resin的配置调整后大致为:

《stdout -log path-format=”log/stdout.log.%Y%m%d” timestamp=”[%Y-%m-%d %H:%M:%S] ” rollover-period=”1D” /》
《stderr -log path-format=”log/stderr.log.%Y%m%d” timestamp=”[%Y-%m-%d %H:%M:%S] ” rollover-period=”1D” /》
《access -log path-format=”logs/access.log.%Y%m%d_%H” rollover-period=”1h”/》
(默认format是combined格式)
上面的是stdout和stderr按天切割(如果代码里异常输出比较多的话,也可以配制成按小时打,例如有:ex.printStackTrace();),access.log按小时切割。

大致分析过程:

访问高峰期时,日志滚动时候,导致线程锁住了。
JMX监控查看线程堆栈可以得知,可以看出大量的线程都 在执行com.caucho.server.log.AccessLog.log的时候BLOCKED了。
==============================
"resin-tcp-connection-*:80-5973" Id=41812 in BLOCKED on lock=java.lang.Object@14dca59
owned by resin-tcp-connection-*:80-5545 Id=41588
at com.caucho.server.log.AccessLog.log(AccessLog.java:310)
at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:206)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:268)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:389)
at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:507)
at com.caucho.util.ThreadPool.run(ThreadPool.java:433)
at java.lang.Thread.run(Thread.java:619)



先下载resin的源代码: http://www.caucho.com/download/resin-3.0.19-src.tar.gz

接下来分析AccessLog的log方法。

可以看到:
if (_isSharedBuffer && ! _isAutoFlush) {
synchronized (_sharedBufferLock) {

而这两个选项的默认值是:_isSharedBuffer=true,_isAutoFlush=false;
(因为resin.conf没有配置对应的属性,例如: shared-buffer=”false” auto-flush=”false”)
而这两个属性在官方文档里并没有直接列出。
http://caucho.com/resin-3.0/config/log.xtp#rollover

(测试了不能设置 auto-flush=”true”,因为没缓冲,还没判断好滚动就直接打到文件了,rollover-size几乎等同失效)

com.caucho.vfs. AbstractRolloverLog.java中:
private static final long DEFAULT_ROLLOVER_CHECK_PERIOD = 600L * 1000L;

private long _rolloverCheckPeriod = DEFAULT_ROLLOVER_CHECK_PERIOD;
滚动日志检测周期默认是10分钟。
而该参数没法在resin.conf中动态配置。

在文件超过指定大小之后,日志滚动的方法为:com.caucho.vfs. AbstractRolloverLog 里的rolloverLog, 这个也是个同步方法:

而执行文件内容的操作是movePathToArchive方法:
而movePathToArchive的做法是:

关键代码是: path.writeToStream(out);和path.truncate()
前一个方法,是表示把当前文件的内容读出来,再写到out里。
后一个方法是,把当前文件内容清空。
而其对应的实现是:
com.caucho.vfs.Path和com.caucho.vfs.FilePath。

从整个代码分析可以得知,resin在按文件大小滚动日志的时候,是检测到当前文件超过200M,就先把缓冲全部写入当前日志文件access.log里,再将access.log的内容读出,再写到 access.log.20090206.1047 这样的文件里,写完之后,再通过truncate利用FileOutputStream的append为false将access.log内容清空。相当于先复制内容到新文件,然后再清空当前文件内容。

而这整个过程中,是同步的,因此在执行复制201M日志的时候,线程全部锁住,而这个时候大量的用户请求正在涌来,导致jmx线程过高且webapp监控告警,于是resin被监控重启。

解决办法:
使用path-format属性替代 path,
例如配置:
《access -log path-format=”logs/access.log.%Y%m%d_%H” rollover-period=”1h”/》
这样就是每小时打一个文件,切换日志输出时候,自动切换,不再产生movePathToArchive操作。
jvm.Log里也没了”Archiving access log to “这样的日志。
Stdout和stderr也是同样处理,有这两个日志的内不会太多,可以配置成按天滚动。
stdout-log元素和stderr-log也有path-format属性。

为什么resin不用File的renameTo通过重命名来切换日志呢,这是因为java的io里,只有所有的流都关闭之后,且操作系统中没有程序对文件持有引用时,文件重命名才能够成功,且renameTo是依赖操作系统的,而这种正在对文件进行读写操作的,执行renameTo无法做到一定成功的。Resin也是因为此,在按文件大小进行滚动的时候,才不得已使用复制文件加清空内容的做法。

原文地址:http://618119.com/archives/2009/02/18/135.html
分享到:
评论

相关推荐

    tomcat-juli.jar,tomcat-juli-adapters.jar,log4j-1.2.12.jar tomcat 6日志输出

    - 对于JULI,通常会在`$CATALINA_HOME/conf/logging.properties`中配置日志属性,例如设置日志级别、处理器(handler)和输出格式。 - 对于Log4j,需要在项目类路径下放置`log4j.properties`或`log4j.xml`文件,...

    flume-ng安装

    `bin/flume-ng agent -n agent --conf conf/ -f conf/flume-conf.properties` 配置多个 Agent 在分布式日志收集系统中,可能需要配置多个 Agent 来收集日志。在这种情况下,可以配置多个 Agent,每个 Agent 负责...

    resin-pro-4.0.65.zip下载

    Resin是一款高性能、轻量级的Java应用服务器,特别适合用于部署和管理Web应用程序。Resin Pro是其专业版,提供了更多高级特性和企业级的支持。版本4.0.65是一个稳定版本,包含了对Java EE 5和部分Java EE 6规范的...

    httpd-ssl.conf 配置文件

    httpd-ssl.conf

    最新版linux logstash-7.15.2-linux-x86_64.tar.gz

    Linux Logstash 7.15.2 是一个强大的开源数据收集、处理和转发工具,尤其在日志管理和分析领域有着广泛的应用。这个版本是专为64位Linux系统设计的,确保了在现代硬件上的高效运行。让我们深入探讨Logstash的功能、...

    安装Apache提示缺少 libapr-1.so.0与libaprutil-1完美解决

    **APR-UTIL**则是在APR的基础上构建的一系列工具和扩展库,提供了数据库接口、加密功能、日志记录等更高级别的服务,使得Apache能够更加灵活地处理各种网络服务需求。 ### 缺失动态链接库的原因 当Apache的安装...

    Nginx安装配置、Resin安装配置说明文档

    c)对 E:\sssssssss \resin\conf\resin.conf 文件进行配置 - 11 - d)80端口修改: - 16 - e)默认发布目录修改: - 16 - f)多虚拟主机: - 16 - g)多端口设置: - 17 - (3) Resin与Eclipse整合 - 17 - 2. Linux - 18 -...

    unimrcp.el7.2020-04-19.tar.xz

    更新历史: 1. 2020-04-14:发布第一版 2. 2020-04-19:修复bug:阿里云Token过期后,未更新 unimrcp,MRCP协议TTS语音合成服务,带有阿里云插件,...7. 运行日志,请查看/opt/pinfu/unimrcp/log/unimrcp_current.log

    Windows版本Redis-x64-5.0.14安装包

    10. **EventLog.dll**:用于Windows事件日志记录的动态链接库,帮助记录Redis服务器的日志信息。 **安装步骤:** 1. 解压下载的Redis安装包到你选择的目录,比如`C:\Redis`。 2. 进入解压后的目录,找到`redis....

    apache-tomcat-9.0.78-windows-x64

    - 线程池设置:调整`conf/server.xml`中的`<Executor>`元素,定制线程池大小,优化并发处理能力。 - 网络连接器配置:调整`<Connector>`元素,如设置连接超时、缓冲区大小等,优化网络通信性能。 **日志与监控**: ...

    logstash-7.17.5-windows-x86_64.zip

    可以通过调整配置参数,如批处理大小和并行处理数量,优化性能。同时,监控 Logstash 的运行状态和日志,以便及时发现和解决问题。 总结来说,Logstash 是一个强大且灵活的数据处理工具,能够帮助用户从不同源头...

    resin-4.0.47.tar.gz

    6. **日志和监控**:Resin提供详细的日志记录和实时性能监控工具,帮助管理员排查问题和优化服务器性能。 安装和配置Resin时,用户需要注意以下步骤: 1. **解压文件**:使用`tar -zxvf resin-4.0.47.tar.gz`命令...

    unimrcp.el7.2020-04-14.tar.xz

    unimrcp,MRCP协议TTS语音合成服务,带有阿里云插件,CentOS-7.6系统,使用: 1. mkdir -p /opt/pinfu && cd /opt/pinfu ...7. 运行日志,请查看/opt/pinfu/unimrcp/log/unimrcpserver_current.log

    最新版linux logstash-7.16.1-linux-x86_64.tar.gz

    1. 日志收集:使用file输入插件读取系统或应用日志,例如`input { file { path => "/var/log/*" } }`。 2. 数据过滤:通过grok过滤器解析日志格式,提取关键信息,如`filter { grok { match => { "message" => "%{...

    nginx-1.19.6_nginx-http-flv-module(64位)

    - **logs**: 记录Nginx的日志文件,包括错误日志和访问日志,这对于调试和监控服务器状态至关重要。 **配置和使用** 使用Nginx-1.19.6并集成HTTP-FLV-Module,你需要编辑`conf/nginx.conf`,添加或修改以下配置段...

    Tomcat使用Log4j输出catalina.out日志

    本篇将探讨如何使用Log4j来替代Tomcat的默认日志输出,达到更灵活和可定制的日志管理。 首先,我们来分析一下Tomcat默认日志管理的一些不足之处。在Tomcat中,默认的日志是通过catalina.out文件记录的,它使用java....

    apache-tomcat-9.0.43-windows-x64.zip

    - 调整`conf/server.xml`中的线程池设置(Executor)以优化并发性能。 - 使用JVM调优工具(如JVisualVM)调整内存分配和垃圾回收策略。 8. **连接器与协议**: - Tomcat支持多种连接器(如NIO、NIO2、APR),...

    xorg.conf配置详解(图形显示).doc

    Xorg.conf 配置详解(图形显示) 在 Linux 系统中,图形配置文件 xorg.conf 是一个非常重要的文件,它用于配置 X Window 系统,并控制图形显示的各种参数。在本文中,我们将详细介绍 xorg.conf 文件的配置详解,...

    resin中关于日志的配置

    - Resin的日志配置通常位于`conf/resin.xml`文件中,可以通过修改此文件来定制日志行为。 - 配置文件中的`<logger>`标签用于定义日志记录器,可以设置多个日志记录器以满足不同模块或级别的需求。 3. **日志级别*...

    myeclipse resin服务器配置

    例如,假设 Resin 安装在 `D:\resion\resin-pro-3.1.9\resin-pro-3.1.9\conf` 目录下,则可以将 `resin.conf` 复制到 `E:\workspace\resin_conf` 并重命名为 `htf_web.conf`。 - **路径示例**:`D:\resion\resin-...

Global site tag (gtag.js) - Google Analytics