OSS Java SDK夯住(Hang)问题排查

夯住(Hang)是指程序仍在运行,卡在某个方法调用上,没有返回也没有异常抛出;卡住时间从几秒到几小时不等。 Java程序发生Hang时,应该首先使用 jstack 把java进程的堆栈信息保存下来 ,供后继分析使用。

调用OSS Java SDK的程序Hang,有以下可能的情况及原因。

说明:

  • jstack -l <pid> > js.txt可以把pid的堆栈信息保存到文件js.txt中。pid可以通过jps命令查找到。
  • 抓包工具,Windows系统下推荐使用Wireshark。捕获筛选器可以设置成
    host <bucket-name>.<endpoint>,例如:
    host my-bucket.oss-cn-hangzhou.aliyuncs.com`
    

    Linux使用tcpdump命令抓包,命令格式如下:

    sudo tcpdump tcp -i <eth0> -t -s 0 -c 200000 and host <bucket>.<endpoint> -w <file.cap>
    

    例如:

    sudo tcpdump tcp -i eth0 -t -s 0 -c 200000 and host my-bucket.oss-cn-hangzhou.aliyuncs.com -w out.cap`
    

    然后用Wireshark打开file.cap分析抓包数据。

  • getObject获取的InputStream需要close,示例如下:
    OSSObject ossObject = ossClient.getObject(bucketName, key);
    ossObject.getObjectContent().close();
    
  • OSS Java SDK 2.2.3前的版本getSimplifiedObjectMeta调用有bug,连接没有关闭,会造成泄漏。2.2.3版本修复。
  • hang在PoolingHttpClientConnectionManager.leaseConnection的堆栈如下:
    "main" prio=6 tid=0x000000000291e000 nid=0xc40 waiting on condition [0x0000000002dae000]
    java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000007d85697f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
    at org.apache.http.pool.PoolEntryFuture.await(PoolEntryFuture.java:138)
    at org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:306)
    at org.apache.http.pool.AbstractConnPool.access$000(AbstractConnPool.java:64)
    at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:192)
    at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:185)
    at org.apache.http.pool.PoolEntryFuture.get(PoolEntryFuture.java:107)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:276)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:263)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
    at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:113)
    at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:123)
    at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:68)
    at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:94)
    at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:146)
    at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:113)
    at com.aliyun.oss.internal.OSSObjectOperation.getObject(OSSObjectOperation.java:229)
    at com.aliyun.oss.OSSClient.getObject(OSSClient.java:629)
    at com.aliyun.oss.OSSClient.getObject(OSSClient.java:617)
    at samples.HelloOSS.main(HelloOSS.java:49)
    
  • hang在java.net.SocketOutputStream.socketWrite的堆栈如下:
    "main" prio=10 tid=0x0000000040112800 nid=0x2ad8 runnable [0x00000000418e1000]
    java.lang.Thread.State: RUNNABLE
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
        at org.apache.http.impl.conn.LoggingOutputStream.write(LoggingOutputStream.java:77)
        at org.apache.http.impl.io.SessionOutputBufferImpl.streamWrite(SessionOutputBufferImpl.java:126)
        at org.apache.http.impl.io.SessionOutputBufferImpl.flushBuffer(SessionOutputBufferImpl.java:138)
        at org.apache.http.impl.io.SessionOutputBufferImpl.write(SessionOutputBufferImpl.java:169)
        at org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:115)
        at com.aliyun.oss.common.comm.RepeatableInputStreamEntity$NoAutoClosedInputStreamEntity.writeTo(RepeatableInputStreamEntity.java:127)
        at com.aliyun.oss.common.comm.RepeatableInputStreamEntity.writeTo(RepeatableInputStreamEntity.java:71)
        at org.apache.http.impl.DefaultBHttpClientConnection.sendRequestEntity(DefaultBHttpClientConnection.java:158)
        at org.apache.http.impl.conn.CPoolProxy.sendRequestEntity(CPoolProxy.java:162)
        at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:237)
        at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:122)
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:271)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
        at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:113)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:121)
        at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:67)
        at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:92)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:140)
        at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:111)
        at com.aliyun.oss.internal.OSSObjectOperation.writeObjectInternal(OSSObjectOperation.java:665)
        at com.aliyun.oss.internal.OSSObjectOperation.putObject(OSSObjectOperation.java:132)
        at com.aliyun.oss.OSSClient.putObject(OSSClient.java:528)
        at com.aliyun.oss.OSSClient.putObject(OSSClient.java:516)
        at com.aliyun.oss.OSSClient.putObject(OSSClient.java:522)
        at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:25)
    
时间: 2024-11-01 11:53:18

OSS Java SDK夯住(Hang)问题排查的相关文章

Aliyun OSS Java SDK超时时间设置

Aliyun OSS Java SDK发送一个请求,有5个阶段: 阶段Ⅰ 从连接池中获取连接,如果使用的连接已经达到最大连接数,则等待直到有连接释放,或达到最大超时时间,抛出异常ConnectionPoolTimeoutException.如果设置了比较大最大连接数,但是并不想让连接池中真正占用很多连接,SDK会自动关闭闲置时间较长的连接. 最大连接数默认1024个,使用ClientConfiguration.setMaxConnections设置. 从连接池中获取默认不超时,可以通过Clien

OSS发布新版Java SDK、Android SDK的公告

尊敬的阿里云用户: 感谢您支持阿里云OSS产品.经过努力,OSS产品更新java版SDK开发包--Java SDK开发包(2014-11-13),安卓发布新版--Android SDK开发包(2014-11-26),如果您在使用中发现任何问题,欢迎您用提供工单的方式反馈给我们.谢谢. 下载地址 Java SDK开发包(2014-11-13) http://help.aliyun.com/view/11108271_13438814.html Android SDK开发包(2014-11-26)

阿里云资源编排服务 Java SDK使用入门

阿里云资源编排服务 Java SDK使用入门 安装依赖 添加Maven库 <repositories> <repository> <id>sonatype-nexus-staging</id> <name>Sonatype Nexus Staging</name> <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url> &

使用oss c sdk自定义上传和下载callback

       前段时间使用阿里云官网提供的OSS C SDK上传和下载数据,想在上传和下载过程中对数据进行一些简单的自定义预处理,看了一下oss c sdk的具体实现,大致了解如何通过自定义上传和下载的callback达到上述目的,这里做一个简单的分享.        OSS C SDK在上传和下载数据时使用了CURL进行通信,之前简单学习过CURL的一些知识,知道CURL提供了一系列Callback,在上传下载时对数据进行一些处理,大家感兴趣的话可以参考: http://curl.haxx.s

发送-信鸽java sdk怎么整合到服务器端?

问题描述 信鸽java sdk怎么整合到服务器端? 我想问一下信鸽上面的java sdk怎么整合到自己的一个服务器端,然后服务器端发送消息通过信鸽到自己的客户端???

拥抱ES6——OSS JavaScript SDK开发手记

JavaScript作为当下最火的语言(之一),结合OSS能够创建出非常丰富的跨前后端的应用.现在,OSS正式推出JavaScript SDK,使用OSS的 前后端 同学 都 可以方便地使用. ES6 首先,什么是ES6? 其实ES6是最新版本的ECMAScript,也就是JavaScript标准. ECMAScript 6, also known as ECMAScript 2015, is the latest version of the ECMAScript standard. > ES

Windows下编译使用Aliyun OSS C SDK

Visual Studio(VS)是win平台下,编译运行C/C++程序的首选.微软发布的VS主要版本如下表: 名称 内部版本 发布日期 支持.NET Framework版本 Visual Studio 6.0 6.0 1998-06 - Visual Studio .NET 2002 7.0 2002-02-13 1.0 Visual Studio .NET 2003 7.1 2003-04-24 1.1 Visual Studio 2005 8.0 2005-11-07 2.0 Visual

表格存储的Java SDK性能优化经验

原文发布于阿里云论坛,在圈子内重发. 问题背景 用户通过Java SDK来访问表格存储,在SDK内部也是有开销的,在高并发的场景下这些开销尤其突出.如果SDK的性能很差,用户为了达到更高的QPS,可能就需要使用更高性能的机器或者更多的机器,从而增加用户使用表格存储的成本.我们对SDK进行性能分析,也发现了很多性能问题,可以说原来的SDK有很大的性能优化空间.在发现SDK性能不高之后,我们进行了一系列优化,其中最重要的改动是,使用HttpAsyncClient库替换了HttpClient,从而把同

oss php sdk+laravel搭建一个简单网站

背景 目前中小型网站最流行的还是采用php搭建自己的web服务器,一个web服务器都会做动静资源分离,静态资源流量小的话,静态文件可以统一放单独目录用域名独立访问,流量稍大的时候,可以直接托管到阿里云OSS上,需要静态资源时从oss拉取,对请求延时苛刻的还可以用CDN做缓存和加速. 目的 介绍如何如何在30分钟内搭建一个简单的web服务器,采用nignx+php-fpm+laravel+oss-php-sdk 框架 ,静态资源托管到阿里云oss上.实现通过浏览器展示一张图片. 简单的服务器框图