在Linux环境下面,Java起多个线程执行程序,长时间后,运行效率会降低,求助

Leaybc 发布于 2018/09/05 23:48
阅读 593
收藏 0

硬件环境:

CPU 8核

内存:16G

软件环境:

Redhat6.5

Jdk 1.8

Hutool4.1.8

问题代码

public static void main(String[] args) {
        Integer poolsize = 1000;
        ExecutorService executor = Executors.newFixedThreadPool(poolsize);
        for (int i = 0; i < poolsize; i++) {
            try {
                executor.submit(new ThreadCrawlerData());
            } catch (Exception e) {
                e.printStackTrace();
                executor.submit(new ThreadCrawlerData());
                continue;
            }
        }
}

首先会有一个main方法,主要的工作就是起1000个线程,使劲的压榨机器的极限。

然后在ThreadData中

@Override
    public void run() {
        Jedis jedis = RedisUtil.getJedis();
        while(true){
            try {
                String jSONString = jedis.lpop("list");
                if (StrUtil.isNotEmpty(JSONString)) {
                    getInfo(jSONString)
                }
            } catch (Exception e) {
                e.printStackTrace();
                continue;
            }
        }
    }

做的就是从redis中,获取一个url,然后发请求去获得信息。

刚开始的时候,速度会很快,几乎压榨完了所有的网络带宽性能。这个也是想达到的效果。

但是过了一段时间,会发现网速并没有完全被使用,以至于处理的速度会慢很多。

在调试的时候,我猜测可能有几个方面:

1.程序编写的问题,逻辑考虑的不合理。我的设想是不顾一切的异常信息,只为了更高的榨取性能。但是想想好像这样也没什么问题。一开始其实没开1000个线程,一开始只开10个线程的情况下,也会出现这个问题。

2.redis 的连接数达到了上限。但是这个也不太能说得通,因为我再启动一个相同的程序的时候,之前的连接没有释放的情况下,会发现带宽还是会被完全使用,所有可能不是redis的问题。

3. Linux 的问题? 这个我没太多的验证,一方面没有root权限,安装一些软件比较麻烦。所有机器的性能,我一般都是通过dstat来观测的。

 

所以来请教一下,不知道有没有朋友遇到过这样类似的问题呢?先谢谢大家了。

加载中
1
stackwill
stackwill

需要有明确的监控,什么时候开始速度下降,jvm内存的变化情况,gc情况,上下文切换,网络情况,把几个曲线对一下,差不多就找到原因了。

0
狐狸糊涂
狐狸糊涂

 

  1. 是否是因为线程数太多导致线程切换频繁实际上并没太多请求发给redis?另外CPU利用率是什么情况?
  2. pop list获取的string有多大,如果你想尽量打满带宽的话,这个数据规模是否足够。我没有试过如果更快的打满网卡带宽,你可以试试把你的数据包尽量达到稍稍低于网卡mtu的设置看看。
  3. 另外,你是想测双向的网络带宽还是单向?如果是双向的话,是否有必要加上写入数据的请求?
Leaybc
Leaybc
唉? 我看CPU的占用率,刚开始刚启动的时候,还是很不错的,基本都是90多, 网速也很快。 但是长时间之后,就很低了,就20多, 网速也差很多了。 所以挺郁闷的。 redis的list 每次数量还是挺多的,每次都是1000多万条记录,一般都是一天才能处理完,所以redis应该是没啥问题的。 第三点也是我困惑的地方,网速慢了之后,接受和发送的速度都下降了。 我猜测可能还是后面线程出了问题。
0
g
gm100861

抓取这么快,没有被封IP就很不错了.

Leaybc
Leaybc
囧, 哈哈, 这个暂时是不管的。就是不太理解怎么速度在长时间之后降下来了。
0
maradona
maradona

你也要考虑被你请求去获得信息的服务的吞吐能力啊...

Leaybc
Leaybc
这个应该不会。。因为。。。老的程序没有关闭,再开启新的,发现速度还是会上去,怀疑还是这边本身的问题。
0
izee
izee

感觉像是redis对象没有销毁造成的

Leaybc
Leaybc
回复 @izee : 哈哈。。。想压榨机器最后一点点的性能。 刚开始还是可以的, 后面莫名其妙的不行了。
izee
izee
另外,你在submit的catch中再执行一个submit的操作也是够骚的
Leaybc
Leaybc
我来试试看, 不知道是不是redis 的连接长时间变慢的。 谢谢啦。
0
b
beastxiao

redis的值有多少个,会取完吗

Leaybc
Leaybc
会取完。 但是速度降下来的时候, 队列里面依然还有很多。
返回顶部
顶部