2014-01-06 2 views
0

Linux (CentOS)에서 Java와 C++ 프로그램간에 엄청난 양의 데이터를 전송해야합니다. 성능이 가장 중요한 관심사입니다. 최고의 선택은 무엇입니까? RAMDisk (/ dev/shm /) 또는 로컬 소켓?IPC : Ramdisk V.S. 소켓

+1

테스트를 실행 했습니까? –

+1

/dev/shm은 램 디스크가 아닙니다. 램 디스크는 디스크 드라이브처럼 취급되는 메모리 조각입니다./dev/shm은 공유 메모리입니다. – paxdiablo

+0

OK,/dev/shm은 램 디스크가 아니지만 적어도 비슷한 성능입니다. 필자의 경우, 작은 파일 (1MB 미만)을 많이 생성하고이 파일을 서버 (클라이언트와 서버는 같은 호스트에 있음)로 보내는 16 개의 클라이언트가 있습니다. 총 데이터 양은 약 1TB입니다. IPC에/dev/shm을 사용하면 하위 폴더에 파일이 기록되고 폴더가 100MB를 초과하면 클라이언트는 다른 폴더를 만들고 새 데이터 파일을 새 폴더에 작성합니다. 폴더가 꽉 차면 (100MB 이상) 클라이언트가 서버에이를 처리하도록 알립니다. – avhacker

답변

1

데이터 보내기를 완료하기 전에 다른 쪽이 (별도의 CPU 코어에서) 데이터 처리를 시작할 수 있기 때문에 소켓이 가장 빠릅니다.

100KB의 데이터를 전송한다고 가정하면 다른 쪽에서는 2KB를 수신하자마자 처리를 시작할 수 있습니다. 그리고 100KB가 모두 전송 될 때까지는 90KB 또는 그 이상의 처리가 완료되어 10KB 밖에 남지 않았습니다.

RAM 디스크가있는 동안에도 시작 데이터를 처리하기 전에 전체 100KB를 써야합니다. 램 디스크보다 소켓을 사용하는 것이 약 10 배 더 빠르다. 양 끝이 거의 같은 양의 작업을해야한다고 가정한다.

RAM 디스크에 100KB를 기록한 다음 1 밀리 초를 기록하는 데 1 밀리 초가 걸릴 수도 있습니다. 소켓을 사용하면 데이터를 보내려면 1 밀리 초가 걸리지 만 모든 데이터가 전송 된 후에는 처리를 완료하는 데 단지 0.1 밀리 초가 소요됩니다.

송신되는 데이터의 양이 클수록 소켓 성능이 향상됩니다. 모든 데이터를 쓰려면 10 초, 모든 데이터를 보낸 후에는 0.1 밀리 초를 사용하여 fnish 처리하십시오.

그러나 RAM 디스크는 사용하기가 더 쉽습니다. 소켓은 코드를 작성하고 디버깅/테스트하는 데 더 많은 시간이 소요되는 데이터 스트림을 사용합니다.

또한 램 디스크가 필요 없다고 가정하십시오. 운영 체제가 어떻게 구성되어 있는지에 따라 회전하는 플래터 하드 드라이브에 100MB를 쓰면 RAM 캐시에 기록한 다음 나중에 하드 드라이브에 넣을 수 있습니다. 데이터가 HDD에 기록 될 때까지 기다리지 않고 임시 RAM 캐시에서 즉시 읽을 수 있습니다. 성능 가정을하기 전에 항상 테스트하십시오. HDD가 자동으로 최적화 되었기 때문에 RAM보다 느린 것으로 가정하지 마십시오.

Mac이 CentOS와 같은 유닉스입니다. 현재 가까운 장래에 언젠가 읽을 예정인 파일의 복사본을 보관하는 데 약 8GB의 RAM이 있습니다. RAM 디스크를 수동으로 생성 할 필요가 없었습니다. 단지 RAM에 경험적으로 넣었습니다. CentOS는 같은 종류의 일을합니다. 실제로 얼마나 빨리 실행하는지 테스트해야합니다.

그러나 소켓은 확실히 처리가 시작되기 위해 모든 데이터를 쓸 필요가 없기 때문에 가장 빠른 옵션입니다.

+0

반드시 그렇지는 않습니다. 공유 메모리를 청크로 나눌 수 있습니다. 공유하는 것들 중 하나가 포인터를 읽고 쓰는 경우 (물론 프로세스 간 세마포어로 보호되는 경우) 소켓처럼 할 수 있습니다. – paxdiablo

+0

@paxdiablo true. 고양이에게 가죽을 칠하는 데는 여러 가지 방법이 있습니다. 나는 RAM 디스크에 ext 파일 시스템을 만들고 마운트 한 다음, 전체 데이터 덩어리를 작성하고 다른 프로세스에 대한 경로를 제공하는 것을 의미하는 "RAM 디스크"로 가정했습니다. 이는 다른 프로세스에 대한 경로를 제공하기 때문에 간단하고 효과적인 방법으로 데이터를 보낼 수 있습니다. 더 복잡한 aproaches를 배우는 데 시간을 보내고 싶지 않습니다. –