问题已解决,根本原因是虚拟机没有配置DNS服务器,OSSClient初始化的时候会调用如下方法尝试解析域名。导致初始化时间超长,且在异常场景下未打印相关错误日志
/**
* 判定一个网络地址是否是IP还是域名。IP都是用二级域名,域名(Localhost除外)不使用二级域名。
* @param uri URI。
*/
private boolean isIpOrLocalhost(URI uri){
if (uri.getHost().equals("localhost")) {
return true;
}
InetAddress ia;
try {
ia = InetAddress.getByName(uri.getHost());
} catch (UnknownHostException e) {
return false;
}
if (ia.getHostName().equals(ia.getHostAddress())) {
return true;
}
return false;
}
最近用阿里云SDK 写上传下载的demo,发现在linux环境下,OSSclient 初次加载时候巨慢,20秒到30秒的时间不等,单步调试发现主要的耗时步骤居然是new 以及ossclient的构造方法执行完毕之后,返回调用处的地方耗时最多。
BTW:多线程场景下,每个线程在第一次加载OSSClient的时候 耗时都是20秒以上。
贴上来的demo代码就是测试两个线程独立加载OSSclient的场景,实测结果第一次加载结束需要20秒,第二次加载仅需要几毫秒
执行结果如下:
SDK版本2.6.0 2.5.0都有同样的问题
java -jar
test start:1500535877789
tt2 step1 1500535877798
tt1 step1 1500535877798
tt2 step2 1500535898281
tt1 step2 1500535898281
tt2 step3 1500535898284
tt1 step3 1500535898286
linux信息如下:
Linux version 3.10.0-229.42.1.97.x86_64 (abuild@HGH1000006709) (gcc version 4.8.3 20140911 (EulerOS 4.8.3-10) (GCC) ) #1 SMP Sat Oct 22 14:09:35 UTC 2016
java版本信息如下:
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
测试代码demo如下:
public class Main
{
public static void main(String[] args)
{
TestThread tt1 = new TestThread();
TestThread tt2 = new TestThread();
tt1.setName("tt1");
tt2.setName("tt2");
Thread t1 = new Thread(tt1);
Thread t2 = new Thread(tt2);
System.out.println("test start:"+System.currentTimeMillis());
t1.start();
t2.start();
}
static class TestThread implements Runnable{
private String name;
@Override
public void run()
{
ClientConfiguration configuration = new ClientConfiguration();
CredentialsProvider credentials = new DefaultCredentialProvider("L*****O", "6****I");
String endpoint = "http://oss.aliyuncs.com";
configuration.setProtocol(Protocol.HTTPS);
System.out.println(name + " step1 "+System.currentTimeMillis());
OSSClient client = new OSSClient("http://oss.aliyuncs.com",
"L*****O", "6*****I", configuration);
System.out.println(name + " step2 "+System.currentTimeMillis());
client = new OSSClient(endpoint, credentials, configuration);
System.out.println(name + " step3 "+System.currentTimeMillis());
}
/**
* 取得 name
* @return 返回 name
*/
public String getName()
{
return name;
}
/**
* 对name进行赋值
* @param name 要给name设置的值
*/
public void setName(String name)
{
this.name = name;
}
}
}
-------------------------
-------------------------
看代码,你是调用了4个线程啊
-------------------------
嗯,看错了,把类创建也看成线程了;
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。