服务器环境
- Linux/红帽
- 6核
- 爪哇 7/8
关于申请:
- 我们正在使用 Java 开发一个低延迟(7-8 毫秒)的高速交易平台
- 有 2 个模块 A 和 B,每个模块都在自己的 JVM 上运行
- B 从 A 获取数据
建筑学:
- 我们已经使用了 MemoryMaps & Unsafe。在这种情况下,模块 A 写入内存映射文件,模块 B 从文件中读取(两者都保存文件的地址位置)
- 我们继续并使用了一个无限循环来继续读取,直到从内存映射文件中获得所需的值
问题
- CPU 利用率飙升至 100% 并在其生命周期内保持不变
问题 :
是否有更复杂的方法来轮询内存映射文件中的值,该值涉及最小开销、最小延迟和最小 CPU 利用率?请注意,每微秒延迟都会降低性能
代码片段
模块 B 的代码片段(从内存映射文件轮询和读取的无休止的 while 循环)如下
FileChannel fc_pointer = new RandomAccessFile(file, "rw").getChannel();
MappedByteBuffer mem_file_pointer =fc_pointer.map(FileChannel.MapMode.READ_ONLY, 0, bufferSize);
long address_file_pointer = ((DirectBuffer) mem_file_pointer).address();
while(true)
{
int value_from_memory_mapped_file = unsafe.getInt(address_file_pointer);
if (value_from_memory_mapped_file .. is different from the last read value)
{
//do some operation....
//exit the routine;
}
else
{
continue;
}
}//end of while