2017-02-08 10 views
0

jnetpcap v1.4r1425로 wireshark의 사용자 지정 버전을 작성하고 있습니다. 난 그냥 오프라인 pcap 파일을 열고 속도를 제외하고 위대한 작품 내 tableview에 표시 싶습니다. 내가 열어 본 파일은 약 100MB이고 700k 패키지가 있습니다.JnetPcap : 오프라인 파일 읽기가 매우 느림

public ObservableList<Frame> readOfflineFiles1(int numFrames) { 
    ObservableList<Frame> frameData = FXCollections.observableArrayList(); 

    if (numFrames == 0){ 
     numFrames = Pcap.LOOP_INFINITE; 
    } 
    final StringBuilder errbuf = new StringBuilder(); 

    final Pcap pcap = Pcap.openOffline(FileAddress, errbuf); 
    if (pcap == null) { 
     System.err.println(errbuf); // Error is stored in errbuf if any 
     return null; 
    } 


    JPacketHandler<StringBuilder> packetHandler = new JPacketHandler<StringBuilder>() { 
     public void nextPacket(JPacket packet, StringBuilder errbuf) { 


      if (packet.hasHeader(ip)){ 
       sourceIpRaw = ip.source(); 
       destinationIpRaw = ip.destination(); 

       sourceIp = org.jnetpcap.packet.format.FormatUtils.ip(sourceIpRaw); 
       destinationIp = org.jnetpcap.packet.format.FormatUtils.ip(destinationIpRaw); 
      } 

      if (packet.hasHeader(tcp)){ 
       protocol = tcp.getName(); 
       length = tcp.size(); 

       int payloadOffset = tcp.getOffset() + tcp.size(); 
       int payloadLength = tcp.getPayloadLength(); 

       buffer.peer(packet, payloadOffset, payloadLength); // No copies, by native reference 
       info = buffer.toHexdump(); 
      } else if (packet.hasHeader(udp)){ 
       protocol = udp.getName(); 
       length = udp.size(); 


       int payloadOffset = udp.getOffset() + udp.size(); 
       int payloadLength = udp.getPayloadLength(); 

       buffer.peer(packet, payloadOffset, payloadLength); // No copies, by native reference 
       info = buffer.toHexdump(); 
      } 

      if (packet.hasHeader(payload)){ 

       infoRaw = payload.getPayload(); 
       length = payload.size(); 

      } 


      frameData.add(new Frame(packet.getCaptureHeader().timestampInMillis(), sourceIp, destinationIp, protocol, length, info)); 
      //System.out.print(i+"\n"); 
      //i=i+1; 
     } 

    }; 
    pcap.loop(numFrames, packetHandler , errbuf); 
    pcap.close(); 


    return frameData; 
} 

이 코드는 첫 번째 어쩌면 400k 패키지의 경우 매우 빠르지 만 이후에는 속도가 느려집니다. 첫 번째 400k 패키지는 약 1 분, 나머지는 약 10 분이 필요합니다. 여기서 문제는 무엇입니까?

목록을 작성하는 데 시간이 너무 많이 걸리는 것은 아닙니다. 추가 listmethod는 O (1), 그렇지 않습니다?

공식 jnetpcap 포럼에서도이 사실을 알았지 만별로 활발하지 않습니다.

편집 : 그것을 밖으로

enter image description here

차례로 때문에 힙 사용의 대규모 속도가 느려집니다. 이것을 줄이는 방법이 있습니까?

+0

핫 스폿이 무엇인지 확인하려면 프로파일 러 (예 :'jvisualvm')를 사용하십시오. – Kayaman

답변

1

프로파일 러에서 보여준 것처럼 메모리가 부족하여 속도가 느려집니다.

-Xmx으로 더 많은 메모리를 할당하거나 모든 패킷을 한 번에 메모리로로드하지 마십시오.

+0

필자는 전에 이런 성능 문제에 관해 많이 생각해 본적이 없으므로 확실하지 않습니다. 나는 아직도 OberservableList에 모든 패킷을 갖고 싶다. 힙 크기를 늘리지 않고서는 그렇게 할 수 없다. – banzai

+1

많은 것들을 가방에 넣고 싶다면 큰 가방을 갖지 않고 그렇게 할 수있는 방법이 있습니까? 마법 가방이 아니라면 요. 유일한 대안은 한꺼번에로드하지 않는 것입니다.하지만 동시에 메모리에 모두 필요하면 힙을 올리십시오. – Kayaman

+0

나는 본다. 그저 100MB의 파일에 1GB 이상의 메모리가 필요하다는 것이 이상한 것처럼 보였습니다. 이제 내가 얼마나 필요할지 알아봐. – banzai