flume高并发优化——(17)解决cpu占用高的问题

在博客中,我们通过jstack分析cpu占用高应用,发现flume占用过高,通过分析代码,发现了一个死循环,这里给大家看看两个代码的差别:

old:

//读到空行
              if(line==null||line.trim().length()<1){
                
                while (true){
                 
                  logger.info(this.filepath+"=randomAccessFile.readLine=> line is null");
                  filePointer = randomAccessFile.getFilePointer();
                  line=randomAccessFile.readLine();
                  if ((line!=null && line.trim().length()>0) || fileLength <= filePointer) {
                    break;
                  }
                  
                }
              }

new:

//读到空行
              if(line==null||line.trim().length()<1){
                int io_c = 0;
                while (true){
                  io_c=io_c+1;
                  logger.info(this.filepath+"=randomAccessFile.readLine=> line is null");
                  filePointer = randomAccessFile.getFilePointer();
                  line=randomAccessFile.readLine();
                  if ((line!=null && line.trim().length()>0) || fileLength <= filePointer) {
                    break;
                  }
                  if(io_c%10==0){
                    try {
                      Thread.sleep(10000);
                    }catch (Exception ex){
                      logger.warn("Thread.sleep(10000)",ex);
                    }
                  }
                }
              }

解决办法也很简单,既然这是必然的操作,那么加入10次休眠10s这样的话,就可以释放cpu资源。注意,内存资源不会释放,因为线程还未结束,是可用状态

猜你喜欢

转载自blog.csdn.net/xvshu/article/details/81189496