大量执行OSS PutObject时卡住的问题排查

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: ##问题反馈 接到有客户反馈,在批量putobject时,发现上传到一定数量后应用卡住了,同时句柄数增加明显。 客户表示 1.使用10个worker线程进行put操作。 2.每个线程独立使用OssClient。 3.OssClient没有执行shutdown ##排查过程 根据客户的描述,写了一个类似的程序来进行复现 开启五个线程,每个线程上传10000次object来测试

问题反馈

接到有客户反馈,在批量putobject时,发现上传到一定数量后应用卡住了,同时句柄数增加明显。
客户表示
1.使用10个worker线程进行put操作。
2.每个线程独立使用OssClient。
3.OssClient没有执行shutdown

排查过程

根据客户的描述,写了一个类似的程序来进行复现
开启五个线程,每个线程上传10000次object来测试

代码片段:

public static void main(String args[]) {
RunnableDemo R1 = new RunnableDemo( "Thread-1");
R1.start();
RunnableDemo R2 = new RunnableDemo( "Thread-2");
R2.start();
RunnableDemo R3 = new RunnableDemo( "Thread-3");
R3.start();
RunnableDemo R4 = new RunnableDemo( "Thread-4");
R4.start();
RunnableDemo R5 = new RunnableDemo( "Thread-5");
R5.start();
 }
public void run() {
          System.out.println("Running " +  threadName );
             for(int i = 0; i < 10000; i++) {
                 try {
                    System.out.println("Thread: " + threadName + ", " + i);
                    //上传部分
                    String content = new String();
                    content="12345";
                // 创建上传Object的Metadata
                ObjectMetadata meta = new ObjectMetadata();
                // 设置上传文件长度
                meta.setContentLength(content.length());
                // 设置上传MD5校验
                String md5 = BinaryUtil.toBase64String(BinaryUtil.calculateMd5(content.getBytes()));
                meta.setContentMD5(md5);
                // 设置上传内容类型
                meta.setContentType("text/plain");
                meta.setServerSideEncryption("AES256");
                // 上传文件
                PutObjectRequest putObjectRequest=new PutObjectRequest("ruide", "1.txt", new ByteArrayInputStream(content.getBytes()), meta);
                PutObjectResult por = ossclient.putObject(putObjectRequest);
                System.out.println("requestid:"+por.getRequestId());
                Thread.sleep(0);
                 }catch (Exception e) {
                     System.out.println("Thread " +  threadName + " interrupted.");
                  }
             }
          System.out.println("Thread " +  threadName + " exiting.");
       }

测试5W次上传请求正常。

而在增加callback后出现了问题

PutObjectRequest putObjectRequest=new PutObjectRequest("ruide", "1.txt", new ByteArrayInputStream(content.getBytes()), meta);
Callback callback = new Callback();
callback.setCallbackUrl("http://xx.xxx.xx.xx/Revice.ashx");
callback.setCallbackBody("bucket:${bucket},size:${size}");
putObjectRequest.setCallback(callback);
PutObjectResult por = ossclient.putObject(putObjectRequest);

1.png

总结

看到上传确实卡住了。减少到1个线程,依然如此,看来并非是线程导致。
在putobject上传的时候,同时也会看到javaw进程的句柄数不断增加。
通过和OSS后端同学确认,在putobject时,如果没有callback是不需要句柄开销的。但如果
PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);
即使不显性的read,那么也会产生句柄开销。而目前的句柄数是1000,当句柄数用完也就无法分配新的句柄导致程序卡住。需要增加
putObjectResult.getCallbackResponseBody().close();

添加后测试,测试OK
2.png
相关文档说明见https://help.aliyun.com/document_detail/32013.html

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
7月前
|
存储 API 对象存储
对象存储OSS产品常见问题之图片无法加载排查如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
663 0
|
网络协议 Java 开发工具
【 OSS 排查方案-9 上传 OSS 延迟超时】
基础排查 一、 上传 OSS 出现慢的场景,OSS 会返回一个 requestID 属性,请保留这个 requestID 这是 OSS 所有信息的查询入口,升级阿里云时可以快速定位问题,如果上传超时的话时没有这个属性的。
9587 1
|
移动开发 JSON JavaScript
阿里云OSS PostObject错误及排查详细版本
PostObject使用表单上传文件到OSS。PostObject的消息实体通过 多重表单格式multipart/form-data 编码,详细说明请参看 RFC 2388。Put Object中参数通过HTTP请求头传递,Post Object参数则作为消息体的表单域传递。
1813 0
|
存储 监控 安全
OSS异常流量排查及防护
OSS适用于存储各种类型的静态资源。您在OSS中存储静态资源。当OSS生成流量大的异常流量时,可能是恶意引用黑客攻击或请求访问OSS资源的恶意IP引起的。针对上述情况,本文将向您展示如何定位异常流量以及如何保护流量。
1671 0
OSS异常流量排查及防护
|
API 对象存储
【OSS 排查方案-10 请求 OSS 返回 404】
什么是 404 404 标准的 http code 状态码,代表用户请求的资源在服务端不存在, 404 并不是一个异常状态码?而是一个正常的响应。换句话说 404 已经成为了一个结果,这种响应常见在 client 端下载 OSS 的资源时出现。
【OSS 排查方案-10 请求 OSS 返回 404】
|
编解码 对象存储 索引
【OSS 排查方案-12 livechannel 直播推流】
OSS livechannel 推流过程 生成推流 URL设置推流状态 录制 M3u8 缺失 默认录制成品的 m3u8 所以只有最后 3 片,遵循的是 hls 协议的默认规则,是正常想象,可以通过调用 PostVodPlaylist 接口将指定时间范围内的 ts 文件汇聚到一个 m3u8 索引内来解决; tips EndTime 必须大于 StartTime,且时间跨度不能大于 1 天。
【OSS 排查方案-12 livechannel 直播推流】
|
JSON 对象存储 数据格式
【OSS 排查方案-13 postobject】
EntityTooLarge 出现这种问题基本是客户端的 post 代码中限制的请求的 body 大小,排查这种问题最好是通过抓包,或者构造 post 源码上看下。当你的 bucket 不是 public-read-write 时,需要客户端的 post 代码中提供 post policy ,这这属性中,有关于 content-length-range 的设置,不注意的话这个地方基础设置都是 10M,建议检查下这个地方。
【OSS 排查方案-13 postobject】
|
对象存储
【OSS 排查方案-14 url 编码问题】
经过 url encode 编码访问失败 编码前 : http://oss-cn-hangzhou.aliyuncs.com/fun-punch-hls/ji-test/c133249354654050a66ec4341e61c23f?Expires=1540451197&OSSAccessKey.
【OSS 排查方案-14 url 编码问题】
|
弹性计算 Java 开发工具
【OSS 排查方案-3】OSS 的网络排查
鉴于之前遇到很多 本地-》OSS ,上传、下载总是慢的情况,或者上传、下载经常出现错误或者异常的问题。根据多个典型案例,抽象出一下排查方案,希望对大家快速定位问题有所帮助。
【OSS 排查方案-3】OSS 的网络排查
|
存储 运维 API
OSS删除bucket报错Bucket不为空的排查方案
本文主要介绍在删除不使用的bucket时候报错bucket不为空无法删除的排查方法,来实现删除bucket;
4746 0
OSS删除bucket报错Bucket不为空的排查方案