solr高并发问题——内存溢出

一、问题描述

在对用solr实现的全文检索系统做性能测试时,发现并发量达到400时,内存溢出。200并发量无任何问题。

二、问题追踪

使用jconsole查看内存消耗,老年代基本占满。线程数大量处于blocked状态。查看blocked条件,发现是记录日志log4j线程一直处于阻塞状态。修改solr中log4j日志配置(仅输出警告信息,并增加缓存),如下:

#Update ‘log4j.appender.file.layout.ConversionPattern‘ value
#Wed Apr 01 14:53:18 CST 2015
solr.log=logs/
log4j.rootLogger=WARN,file, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n
log4j.appender.CONSOLE.BufferedIO=true
log4j.appender.CONSOLE.BufferSize=8192
log4j.appender.CONSOLE.ImmediateFlush=false
#- size rotation with log cleanup.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=4MB
log4j.appender.file.MaxBackupIndex=9
log4j.appender.file.BufferedIO=true
log4j.appender.file.BufferSize=8192
log4j.appender.file.ImmediateFlush=false

#- File to log to and log format
log4j.appender.file.File=${solr.log}/solr.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m\n
log4j.logger.org.apache.zookeeper=WARN
log4j.logger.org.apache.hadoop=WARN
log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF

问题依旧未得到解决,重新查看阻塞线程堆栈信息。发现调用log4j的线程不是solr后端的线程,而是velocity进程。问题找到。修改velocity配置文件(velocity.properties),仅输出错误信息。如下:

input.encoding=UTF-8

output.encoding=UTF-8

runtime.log.error.stacktrace = false  

runtime.log.warn.stacktrace = false  

runtime.log.info.stacktrace = false  

runtime.log.logsystem.class = org.apache.velocity.runtime.log.SimpleLog4JLogSystem  

runtime.log.logsystem.log4j.category = velocity_log  

log4j.logger.velocity_log=ERROR,CONSOLE

问题解决。但是只是回避了日志输出的问题。

三、最终解决方案

1、减少日志输出。

2、增加缓存功能。

3、实现异步日志IO功能。

PS:velocity.properties配置文件的前两行用于解决solr/browse前端页面中文乱码的问题。只需在velocity.properties配置文件添加编码格式。并在solr.config中配置使用就OK。solr.config配置如下:

       <str name="wt">velocity</str>

       <str name="v.template">browse</str>

       <str name="v.layout">layout</str>

       <str name="v.properties">velocity.properties</str>

       <str name="v.contentType">text/html;charset=UTF-8</str>
时间: 2024-10-24 11:54:29

solr高并发问题——内存溢出的相关文章

Solr Dataimporthandler 导入MySQL 内存溢出。

最近准备把一千九百多万数据导入Solr中,在以前测试数据只有一两百万,全量导入没有任务问题.但是,换成一千九百万数据时,solr报内存异常,整个tomcat无法使用.我发现,我给tomcat最大堆内存512M.我觉得,可能是内存过小,于是,我把内存改大些,1024M(set JAVA_OPTS=-server -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256M ).结果,还是内存溢出.我想已经不是tomcat内存的问题(当然,如果

Java高并发-Java内存模型和线程安全

一.原子性 原子性是指一个操作是不可中断的.即使在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰. i++是原子操作吗? 不是,包含3个操作:读i,i=i+1,写i 32位的机子上读取64位的long型也不是原子操作 二.有序性 2.1 举例 在并发时,程序的执行可能会出现乱序 2.2 步骤 一条指令的执行是可以分为很多步骤的: 取指IF 译码和取寄存器操作数ID 执行或者有效地址计算EX 存储器访问MEM 写回WB 流水线执行指令 分析: 指令分解成不同阶段 假设一条指令消耗一

Java虚拟机6:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别

http://www.cnblogs.com/xrq730/p/4839245.html 前言 之前的文章尤其是讲解GC的时候提到了很多的概念,比如内存溢出和内存泄露.并行与并发.Client模式和Server模式.Minor GC和Full GC,本文详细讲解下这些概念的区别. 内存溢出和内存泄露的区别 1.内存溢出 内存溢出指的是程序在申请内存的时候,没有足够大的空间可以分配了. 2.内存泄露 内存泄露指的是程序在申请内存之后,没有办法释放掉已经申请到内存,它始终占用着内存,即被分配的对象可

java架构师课程、性能调优、高并发、tomcat负载均衡、大型电商项目实战、高可用、高可扩展、数据库架构设计、Solr集群与应用、分布式实战、主从复制、高可用集群、大数据

15套Java架构师详情 * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; color: #FF0 } 15套java架构师.集群.高可用.高可扩展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布式项目实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  clo

转---高并发Web服务的演变——节约系统内存和CPU

[问底]徐汉彬:高并发Web服务的演变——节约系统内存和CPU 发表于22小时前| 4223次阅读| 来源CSDN| 22 条评论| 作者徐汉彬 问底Web服务内存CPU并发徐汉彬 摘要:现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.一味地通过增加机器来解决并发量的增长,成本是非常高昂的.结合技术优化方案,才是更有效的解决方法. [导读] 徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小

高并发Web服务的演变:节约系统内存和CPU

一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴的方式解决,就是增加Web系统的机器和升级硬件配置.虽然现在的硬件越来越便宜,但是一味地通过增加机器来解决并发量的增长,成本是非常高昂的.结合技术优化方案,才是更有效的解决方法. 并发连接数为什么呈指数增长?实际上,从这几年的用户基数上看,这个数量并没有出现指数增长,因此它并非主要原因.主要原因,还是web变得更复杂,交互更丰富所导致的. 1. 页面元素增

【问底】徐汉彬:高并发Web服务的演变——节约系统内存和CPU

摘要:现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.一味地通过增加机器来解决并发量的增长,成本是非常高昂的.结合技术优化方案,才是更有效的解决方法. [导读] 徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设. 一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴

[转]solr DataImportHandler 解决mysql 表导入内存溢出问题

最近一个项目要用到solr做全文检索,开始盲人摸象. 用tomcat 7 开始配置,开始正常,但是遇到cookie里有中文就报错. 无奈,换tomcat 6, 结果DataImportHandler 就不间断报内存溢出的错误. 百度google之, 发现资料都是很老的,不是说mysql不支持某属性,就是要自己改导入代码.期间得知 batchSize这个属性,遂查询官网.(关键时刻,还是官网给 力) mysql的设置(红色部分),搞定. <dataSource type="JdbcDataS

UIWebView内存占用过高、崩溃、内存溢出

UIWebView内存占用过高.崩溃.内存溢出,有需要的朋友可以参考下. 项目当中模拟器上运行UIWebView读取本地杂志,没问题,真机测试经常内存溢出崩溃. 查了资料因为Html里的js 导致的内存泄漏,每次打开一个连接就会把"WebKitCacheModelPreferenceKey"设置成1. UIWebView 增加 - (void)webViewDidFinishLoad:(UIWebView *)webView { [[NSUserDefaults standardUse