文件上传导致CPU过高

define_Mr_z 发布于 2014/06/27 09:22
阅读 1K+
收藏 1

    现在遇到一个问题,用struts2上传图片到数据库,在后台直接获取文件流存入数据库,在单机和压力测试效果都良好,但是一到大并发量的环境就会导致CPU过高,请问这是怎么回事?

InputStream ii = null;
InputStream is = null;
try {
    if (file == null) {
        request.setAttribute("message", "上传失败!");
        return "error";
    }
    ii = new FileInputStream(file);
    byte[] b = new byte[ii.available()];
    while ((bytesRead = ii.read(b)) != -1) {
        bytesRead = ii.read(b);
    }
    for (int i = b.length - 10; i < b.length; i++) {
        res += Integer.toHexString(b[i]);
    }
    for (int j = 0; j < 2; j++) {
        start += Integer.toHexString(b[j]);
    }
    for (int k = b.length - 12; k < b.length - 10; k++) {
        end += Integer.toHexString(b[k]);
    }
    //此处省略相关判断逻辑


    is = new FileInputStream(file);
    this.registerService.upPhotoSave(username, is);
} catch (IOException e) {
    request.setAttribute("message", "上传失败,请重新上传!");
    e.printStackTrace();
    return "error";
  } finally {
      try {
          if (ii != null) {
              ii.close();
          } else {
              request.setAttribute("message", "上传失败,请重新上传!");
              return "error";
          }
          if (is != null) {
              is.close();
          }
      } catch (Exception e2) {
          request.setAttribute("message", "关闭文件流失败!");
          e2.printStackTrace();
          return "error";
      }
}



加载中
0
0-1
0-1
先控制下并发连接数~
0
define_Mr_z
define_Mr_z
和这没关系吧,你不能限制用户访问啊
0
ArrayListt
ArrayListt

开线程去读取流保存。

或者加一个队列吧。只是这样可能不是实时的。

0
酷酷的就
酷酷的就

换个文件上传组件试试吧, 或者控制文件大小什么的

而且上传并发大必然导致IO,内存,cpu上涨,这个没辙,只能控制并发量,工厂模式如何?

0
define_Mr_z
define_Mr_z

引用来自“刘禹星”的评论

开线程去读取流保存。

或者加一个队列吧。只是这样可能不是实时的。

这是个实时的web系统 并发大约1000多...
0
ArrayListt
ArrayListt

引用来自“刘禹星”的评论

开线程去读取流保存。

或者加一个队列吧。只是这样可能不是实时的。

引用来自“define_Mr_z”的评论

这是个实时的web系统 并发大约1000多...

如果必须要求实时,那么要么换一个性能好点主服务器,要么加一个上传服务器,要么就限制大小。

楼上有说换一个上传组件,也可以试试。

0
define_Mr_z
define_Mr_z

引用来自“刘禹星”的评论

开线程去读取流保存。

或者加一个队列吧。只是这样可能不是实时的。

引用来自“define_Mr_z”的评论

这是个实时的web系统 并发大约1000多...

引用来自“刘禹星”的评论

如果必须要求实时,那么要么换一个性能好点主服务器,要么加一个上传服务器,要么就限制大小。

楼上有说换一个上传组件,也可以试试。

应该不是服务器的问题 现在已经有负载均衡了 而且服务器性能也不错 现在在试着改为cos 但是好像改为cos之后request全乱了 其他页面的验证参数和验证码都获取不到或者获取错误了
0
ArrayListt
ArrayListt

引用来自“刘禹星”的评论

开线程去读取流保存。

或者加一个队列吧。只是这样可能不是实时的。

引用来自“define_Mr_z”的评论

这是个实时的web系统 并发大约1000多...

引用来自“刘禹星”的评论

如果必须要求实时,那么要么换一个性能好点主服务器,要么加一个上传服务器,要么就限制大小。

楼上有说换一个上传组件,也可以试试。

引用来自“define_Mr_z”的评论

应该不是服务器的问题 现在已经有负载均衡了 而且服务器性能也不错 现在在试着改为cos 但是好像改为cos之后request全乱了 其他页面的验证参数和验证码都获取不到或者获取错误了

cos?china-os?哈哈。

继续服务器不差,那就换个上传组件试试

0
define_Mr_z
define_Mr_z

引用来自“刘禹星”的评论

开线程去读取流保存。

或者加一个队列吧。只是这样可能不是实时的。

引用来自“define_Mr_z”的评论

这是个实时的web系统 并发大约1000多...

引用来自“刘禹星”的评论

如果必须要求实时,那么要么换一个性能好点主服务器,要么加一个上传服务器,要么就限制大小。

楼上有说换一个上传组件,也可以试试。

引用来自“define_Mr_z”的评论

应该不是服务器的问题 现在已经有负载均衡了 而且服务器性能也不错 现在在试着改为cos 但是好像改为cos之后request全乱了 其他页面的验证参数和验证码都获取不到或者获取错误了

引用来自“刘禹星”的评论

cos?china-os?哈哈。

继续服务器不差,那就换个上传组件试试

cos和fileupload一样 都是上传组件
0
有待分裂的人格们
有待分裂的人格们
可以查看一下是否有线程死锁。最近遇到一个类似的问题,解压缩使用zlib,会有cpu飙至500%以上的情况~
返回顶部
顶部