2012-07-02 2 views
0

내 프로그램이 네트워크에서 Java 객체를 전송하는 데 사용하는 대역폭의 양을 측정하려고합니다. 나는 단순히 객체를 디스크에 직렬화하고 파일 크기를 표시로 사용할 수 있다고 생각했지만 이것이 사실이 아닌 것처럼 보입니다.디스크에 직렬화하고 네트워크를 통해 전송할 때 Java의 크기가 다른 것

cat test_112_512 | grep '54544 >' | awk '{N = N + $NF + 20} END {print N}' 

20 바이트이다 :

sudo tcpdump -l -i lo port 54544 | tee test_112_512 

그런 다음 나는 다음과 같은 명령을 사용하여 사용되는 전체 트래픽을 결정하기 : tcpdump를 사용하여 네트워크 사용을 캡처하는 동안 내가 한 일은 파일에 객체에는 직렬화했다 tcpdump가 길이를보고 할 때 고려하지 않는 TCP 헤더 (~ 250 패킷)를 설명합니다. grep 부분은 내가 관심이 없기 때문에 돌아 오는 트래픽을 무시하는 것입니다.

이 방법을 사용하면 전체 네트워크 트래픽이 디스크의 파일 크기보다 최대 10 % 가량 적다는 것을 알 수 있습니다. 디스크상의 파일에는 TCP 헤더가 없으므로 예기치 않은 결과가 발생합니다. 내가 뭔가 잘못하고 있는거야?

+2

http://en.wikipedia.org/wiki/Block_%28data_storage%29 –

+0

댓글을 달기보다는 답변으로 게시해야합니다. – WhyNotHugo

+0

파일 크기를 얻기 위해'ls -l'을 사용하고 있습니다. – blz

답변

0

Java 직렬화는 대상과 관계없이 항상 동일한 크기입니다. 보낸 금액을 줄일 수있는 한 가지는 이전에 같은 스트림에서 보낸 내용입니다. 예 : 기존 스트림에 객체를 쓰면 파일에 단독으로 쓰는 것보다 작을 수 있습니다.

0

분명히 모든 TCP 오버 헤드를 고려하지 않았습니다. 예를 들어, TCP 헤더는 20 바이트 이상이 될 수 있으며 가변 길이이며 연결 및 닫기 핸드 셰이크, ACK 등을 설명하지 않은 것일 수 있습니다.

관련 문제