服务器环境
- Linux/RedHat操作系统
- 6核心CPU
- Java 7/8版本
关于应用程序:
- 我们正在开发一个使用Java的低延迟(7-8毫秒)高速交易平台
- 该平台有2个模块A和B,每个模块都在自己的JVM上运行
- B从A获取数据
架构:
- 我们利用了内存映射和Unsafe技术。在这种情况下,模块A将数据写入到一个内存映射文件中,模块B从该文件中读取数据(两个模块都持有文件的地址位置)
- 我们采用无限循环的方式继续读取,直到从内存映射文件中获得所需的值为止
问题:
- CPU利用率飙升到100%并保持在该水平直到其生命周期结束
问题:
是否有更复杂的方式来轮询内存映射文件中的值,并且需要最小的开销、延迟和CPU利用率?请注意,每微秒的延迟都会降低性能。
代码片段:
模块B的代码片段(用于轮询和从内存映射文件中读取数据的无限循环)如下:
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