linux 下 tomcat 运行报错 Broken pipe

本文介绍了解决Linux环境下Tomcat服务器频繁崩溃的方法,通过设置环境变量_JAVA_SR_SIGNUM为12来避免高并发时JVM的信号处理问题,同时提供了深入理解信号(SIGSEGV, SIGUSR2)及优化Java应用的建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

 

 转载: https://www.cnblogs.com/yaowen/p/9726453.html

 

执行如下命令:

 export _JAVA_SR_SIGNUM=12

 

说明: 

有可能是linux的线程机制会产生JVM出错的问题,特别是在连接高峰期间经常出现这样的问题,tomcat在linux下也出现类似情况。
  解决办法是在环境变量中设置: _JAVA_SR_SIGNUM = 12 基本就可以解决。

在WIN环境变量中设置: _JAVA_SR_SIGNUM=12, 若Linux下用 export _JAVA_SR_SIGNUM=12, 基本就可以解决. 
  sun的解释:
  --posted by: cooper 
  Below is a clipping from Sun on working around JVM crashes under high 
  thread counts in the JVM 1.3 for Linux 
  On Linux, use a larger signal number for hotspot thread 
  suspension/resumption handler. The signal number being used is 
  specified by environment variable _JAVA_SR_SIGNUM. Setting it to a 
  number larger than SIGSEGV (11) will solve the PRoblem. A good number 
  to use is 12, which is SIGUSR2. Using signal 16 to work around the 
  problem might have potential problems. So on tcsh, "setenv 
  _JAVA_SR_SIGNUM 12" can solve the problem.

这个异常是由于以下几个原因造成。 

1、客户端再发起请求后没有等服务器端相应完,点击了stop按钮,导致服务器端接收到取消请求。  通常情况下是不会有这么无聊的用户,出现这种情况可能是由于用户提交了请求,服务器端相应缓慢,比如业务逻辑有问题等原因,导致页面过了很久也没有刷新出来,用户就有可能取消或重新发起请求。

  2、Tomcat服务器在接受用户请求的时候,有其自身的处理能力,线程、服务器等各个资源限制,超出Tomcat承载范围的请求,就会被tomcat停掉,也可能产生该错误。 

3、linux的线程机制会产生JVM出错的问题,特别是在连接高峰期间经常出现这样的问题,tomcat在linux下也出现类似情况。 
Java代码

  1. 1.sun的解释: 
  2. 2.--posted by: cooper 
  3. 3.Below is a clipping from Sun on working around JVM crashes under high 
  4. 4.thread counts in the JVM 1.3 for Linux 
  5. 5. 
  6. 6.On Linux, use a larger signal number for hotspot thread 
  7. 7.suspension/resumption handler. The signal number being used is 
  8. 8.specified by environment variable _JAVA_SR_SIGNUM. Setting it to a 
  9. 9.number larger than SIGSEGV (11) will solve the problem. A good number 
  10. 10.to use is 12, which is SIGUSR2. Using signal 16 to work around the 
  11. 11.problem might have potential problems. So on tcsh, "setenv 
  12. 12._JAVA_SR_SIGNUM 12" can solve the problem. 
  13. sun的解释: 
  14. --posted by: cooper 
  15. Below is a clipping from Sun on working around JVM crashes under high 
  16. thread counts in the JVM 1.3 for Linux 
  17.  
  18. On Linux, use a larger signal number for hotspot thread 
  19. suspension/resumption handler. The signal number being used is 
  20. specified by environment variable _JAVA_SR_SIGNUM. Setting it to a 
  21. number larger than SIGSEGV (11) will solve the problem. A good number 
  22. to use is 12, which is SIGUSR2. Using signal 16 to work around the 
  23. problem might have potential problems. So on tcsh, "setenv 
  24. _JAVA_SR_SIGNUM 12" can solve the problem.

复制代码

“_JAVA_SR_SIGNUM=12”等号两边必须没有空格,等号是半角 

 

资料:
Broken pipe产生的原因通常是当管道读端没有在读,而管道的写端继续有线程在写,就会造成管道中断。(由于管道是单向通信的) SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。 以下是UNIX的信号解释: 11 / SIGSEGV: Unerlaubter Zugriff auf Hauptspeicher (Adressfehler). 12 / SIGUSER2: User-defined Signal 2 (POSIX). 把_JAVA_SR_SIGNUM改成12只是将信号至成user-defined,让它不报出来而已,不能解决问题。 建议采取的方式: 
1. 资源没有完全释放,用完后要至NULL 值(JAVA的GC没那么完善) 
2. 数据库连接顺序关闭!(RS,PS,CONN) 
3. 优化JAVA虚拟机 加入相应的内存参数! 
4. 不要在数据库中获取大段文本(即一个栏位的值不要太大) 
5. JAVA 不推荐 用String 获取大量信息。(容易造成内存泄露,建议用StringBuffer) 
6. 页面重复提交 
7. 尽量将METHOD移到JAVA中,在JSP中所有的方法都看做全局变量,编译执行本身就有很多问题。 
8. 如果是查询功能,尽可能的使用非XA(事务)。 
9. 尽量用较新较稳定版本的JDK,低版本的JVM本身也有很多BUG,比如1。5的垃圾回收比起1。2,1。3一定是非常明显的进步。 
10. LINUX系统本身没有这么稳定,有些问题无法避免的~~:)

### Eureka 启动后 CPU 占用过高及 Broken Pipe 报错分析 当 Spring Cloud 的 Eureka Server 部署并运行时,如果遇到高 CPU 使用率和 `Broken Pipe` 错误,通常是由以下几个原因引起的: #### 1. **心跳机制频繁触发** Spring Cloud 中的服务实例会定期向 Eureka 注册中心发送心跳请求以保持注册状态。如果服务数量较多或者网络延迟较高,则可能导致大量的心跳流量涌入 Eureka Server,从而增加其负载[^2]。 解决方案可以考虑调整客户端和服务端的相关配置参数来优化性能: - 增加续约间隔时间 (`lease.renewal.interval.in.seconds`) 来减少每秒的续约次数。 - 调整期望续租百分比 (`renewalPercentThreshold`) 和服务器缓存清理频率 (`evictionIntervalTimerInMs`) 参数,降低不必要的资源消耗。 ```yaml eureka: instance: leaseRenewalIntervalInSeconds: 30 # 默认为30秒 server: evictionIntervalTimerInMs: 60000 # 清理无效记录的时间间隔,默认60秒 ``` #### 2. **线程池设置不合理** 默认情况下,Tomcat 或 Jetty 等嵌入式 Web 容器使用的线程数可能不足以处理大规模并发连接请求,在高压力场景下容易造成阻塞现象,进而引发 CPU 利用率飙升问题[^3]。 可以通过修改容器的最大线程数目以及其他相关属性来进行改进: 对于 Tomcat 可以这样设定: ```properties server.tomcat.max-threads=500 server.tomcat.accept-count=100 server.connection-timeout=30000 ``` 而对于 Netty 运行环境则需关注 NIO 事件循环组大小等因素的影响。 #### 3. **Broken Pipe 异常解析** 该错误一般发生在写数据到已关闭套接字的情况之下。具体来说就是当远程主机突然断开了 TCP 连接之后再尝试往这个通道里传输信息就会抛出此异常消息[^4]。 一种常见的做法是在程序层面捕获此类异常并通过日志记录下来而不中断整个应用流程;另外还可以通过合理配置超时选项避免长时间等待无响应节点回复而导致管道破裂风险上升。 例如可以在 application.yml 文件中加入如下内容防止部分慢速链接影响整体表现: ```yaml ribbon: ReadTimeout: 5000 ConnectTimeout: 2000 hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 5000 ``` 以上方法能够有效缓解因网络波动等原因造成的短暂失联状况下的报错情况发生几率。 --- ### 示例代码片段展示如何自定义过滤掉某些特定类型的异常报告行为 下面给出一段简单的 Java 实现例子用于演示目的仅限于说明概念并非实际生产环境中推荐的最佳实践方式: ```java @Component public class CustomExceptionHandler implements ErrorController { @Override public ResponseEntity<String> handleError(HttpServletRequest request, Exception ex) { if (ex instanceof SocketException && "Broken pipe".equals(ex.getMessage())) { log.warn("A broken pipe exception was caught and ignored."); return new ResponseEntity<>("Ignored broken pipe", HttpStatus.OK); } throw ex; } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值