일부 최신 네트워크 카드는 직접 메모리 액세스를 지원하여 성능을 향상시킵니다. Java에서이 기능을 어떻게 활용할 수 있습니까?Java의 네트워크 카드에 대한 직접 메모리 액세스
JVM이이를 자동으로 제공합니까, 아니면 해당 NIC와 통신하기 위해 사용하고있는 ByteBuffers에 대해 allocateDirect를 수행해야합니까?
누구에게이 문제를 설명하는 문서가 있습니까?
일부 최신 네트워크 카드는 직접 메모리 액세스를 지원하여 성능을 향상시킵니다. Java에서이 기능을 어떻게 활용할 수 있습니까?Java의 네트워크 카드에 대한 직접 메모리 액세스
JVM이이를 자동으로 제공합니까, 아니면 해당 NIC와 통신하기 위해 사용하고있는 ByteBuffers에 대해 allocateDirect를 수행해야합니까?
누구에게이 문제를 설명하는 문서가 있습니까?
일반적인 데스크탑/서버 JVM에서는 자바 내부에서이를 수행 할 수 없습니다. 운영체제 영역은 C 코드를 사용해야하기 때문입니다. JNI 또는 JNA에서이 작업을 수행하는 방법을 살펴보십시오. 이것이 정확하게 맞지 않으면 응용 프로그램이 약해질 수 있습니다.
네트워크 카드의 DMA 기능을 사용하는 것은 운영 체제 작업입니다. JVM은 운영체제가 실제로 어떻게되는지 신경 쓰지 않고 단순히 "네트워크 인터페이스"와 통신하기 위해 운영체제의 기능을 사용합니다.
예 - ankon의 답변이 맞습니다. Java는 가상 머신입니다 (따라서 JVM의 "VM", 실제로 Sun은 하나의 물리적 버전을 구축했습니다 - 어딘가에 표시됩니다).
Java는 PC의 어디에서나 사용할 수있는 ActiveX와는 달리 샌드 박스 외부에 도달하도록 설계된 적이 없었습니다.
ActiveX가 지난 몇 년간 브라우저를 통해 수행 한 모든 나쁜 점을 생각해보십시오. 자바에서 그런 일이 일어나기를 원하지 않을 것입니다. 비록
... 예를 들어, 그 ActiveX 컨트롤, 또는 DLL의 같은 하드웨어 (에 대한 액세스 권한을 가지고 자바 객체를 인스턴스화 할 수있을
당신이 - 당신은 좋겠 쓰기도해야합니다).
처리량이 문제입니다. 100MB 또는 1000MB 카드의 경우 JVM (OS에서 실행되는 VM이므로 하드웨어에서 제거 된 두 레이어 임)은로드시 처리 할 속도가 있습니까? Java 프로그램이 NIC에서 데이터를 유지하면서 (시스템의 나머지 부분에 대한 영향을 생각해보십시오.)
이 시점에서, 당신은 아마도 당신의 솔루션에 대한 열심히 노력하는 용기를 C로 작성하는 것이 더 나을 것입니다. 자바로 그 데이터를 가지고 놀 필요가 있다면, Java가 접근 할 수있는 장소 .
Java에서 필요한 네트워크 처리량을 얻지 못한다면 액세스하려면 C 래퍼를 작성해야합니다.
코드를 벤치마킹하여 성능 문제가 실제로 어디에 있는지 찾아 냈습니까? 우리가 JNI에 의지하지 않고 당신을 도울 가능성이 있음을 알려 주시면
나는 allocateDirect가 특별히이 경우에 해당한다고 생각했습니다. C 또는 JNI 사용을 계획하지 않습니다. 향상된 대기 시간을 위해 10 기가의 NIC에서 DMA를 사용하고 싶습니다. –
대기 시간을 줄이기위한 지속적인 노력 중 일부입니까? 여기에 얼마나 많은 시간을 보내고 있는지에 대한 경험적 증거가 있습니까? –