在Ubuntu系统中排查WebLogic性能瓶颈,需从系统层、应用层、JVM层多维度分析,结合监控工具定位资源瓶颈(CPU、内存、I/O)或应用逻辑问题(线程阻塞、内存泄漏)。以下是具体步骤:
首先通过Ubuntu系统工具监控CPU、内存、磁盘I/O等基础资源的使用情况,快速定位瓶颈所在:
top命令查看进程CPU使用率(按P键按CPU排序),若WebLogic进程(java)占用过高,进一步用top -Hp <PID>查看该进程下的线程CPU占用,找出高消耗线程;或使用vmstat 1监控系统整体CPU使用情况(us为用户态CPU,sy为内核态CPU,若us+sy长期超过70%,可能存在CPU瓶颈)。free -h查看系统内存使用(used/total比例),若内存占用过高,需检查WebLogic的JVM堆内存设置(-Xms、-Xmx)是否合理;用vmstat 1查看si(swap in)、so(swap out)值,若频繁换页(si/so大于0),说明物理内存不足。iostat -x 1查看磁盘读写延迟(await,单位ms),若await超过20ms,说明磁盘I/O性能不足;或用iotop查看具体进程的磁盘读写情况,定位高I/O进程。通过WebLogic提供的内置监控工具,查看线程、连接池、JVM等关键指标,识别应用层瓶颈:
http://<IP>:7001/console),导航至Servers -> <YourServer> -> Monitoring -> Performance,查看以下指标:
Idle Threads持续为0且Execute Queue Length(等待队列)递增,说明线程池不足(需调整ExecuteThreadTotal参数);Heap Memory Usage若频繁达到-Xmx上限,说明JVM堆内存不足(需扩容或优化应用内存使用);Throughput(单位时间请求数)若下降且Response Time(响应时间)上升,说明应用处理能力不足。setDomainEnv.sh,添加-Dcom.sun.management.jmxremote.port=9000等参数),使用JConsole或VisualVM连接,查看更详细的JVM指标(如GC频率、类加载情况)或WebLogic MBean(如ThreadPoolRuntimeMBean、JDBCConnectionPoolRuntimeMBean)。若系统或应用层监控未明确瓶颈,需深入JVM层分析:
top显示CPU占用高但无法定位线程,或应用响应慢但线程池未满,可通过kill -3 <Java_PID>生成Thread Dump(需多次抓取,间隔1-2秒),用ThreadLogic或VisualVM分析:
RUNNABLE状态的线程,若大量线程阻塞在数据库查询(如executeQuery)、同步锁(如synchronized块)或外部接口调用(如HttpClient),说明存在线程阻塞问题(需优化代码逻辑或增加资源)。jmap -heap <Java_PID>显示堆内存使用持续增长且GC无法回收,用jmap -dump:format=b,file=heap.hprof <Java_PID>生成Heap Dump,用Eclipse MAT或VisualVM分析:
byte[]、String),追踪其引用链,若发现未释放的对象(如缓存未清理、静态集合持有对象引用),说明存在内存泄漏(需修复代码)。根据上述监控结果,针对性优化应用代码或WebLogic配置:
ExecuteThreadTotal(线程池总数)不足,增加该参数值(需结合CPU核心数,一般设置为CPU核心数*2+1);若ExecuteThreadMax(最大线程数)过小,调整以避免线程饥饿。JDBCConnectionPoolRuntimeMBean显示Waiters(等待连接数)递增,说明连接池不足,增加InitialCapacity(初始连接数)和MaxCapacity(最大连接数);若StuckThreads(卡住线程)递增,检查SQL语句性能(如未加索引、复杂查询)。Session占用内存过大,启用内存复制(In-Memory Replication,比JDBC持久化快10倍);减少session.put()调用次数,合并多次写入为一次(如将用户信息一次性存入session)。为避免突发瓶颈,建议部署自动化监控工具,持续收集性能数据并预警:
weblogic-monitoring-exporter将WebLogic指标暴露为REST API,用Prometheus采集数据,Grafana展示仪表板(如CPU、内存、线程池使用率),设置阈值预警(如CPU超过80%时发送邮件)。ServerRuntimeMBean.HealthState)、系统资源(如磁盘空间),触发告警(如服务宕机时短信通知)。通过以上步骤,可从系统资源→WebLogic自身→JVM→应用代码逐步定位性能瓶颈,结合监控工具实现持续优化。需注意,性能优化需结合业务场景(如高并发场景需优先调整线程池,大数据量场景需优化数据库查询),避免盲目调整参数。