ファイルをメモリにロードする MPI を使用して、単純な並列アプリケーションを開発しています。そのファイルは、NFS 経由でコンピューター クラスターのノードにエクスポートされます。場合によっては、NFS のパフォーマンスが大幅に低下し、何千もの追加の TCP パケットがサーバーからクライアントに送信されることに気付き、コードでの fseek() の使用に問題があることを突き止めました。
//Seek to data and load them to array
fseek ( fp, ( unsigned int ) dec_number + start, SEEK_SET );
for ( i = 0; i < n * mpi_n; i++ ) {
if ( ! feof ( fp ) )
text[i] = fgetc ( fp );
if ( i > 0 && n > mpi_n && i % mpi_n == 0 )
fseek ( fp, n - mpi_n, SEEK_CUR );
}
fclose ( fp );
fseek() を使用しない同じコードは問題なく動作するため、各 fseek() の後にサーバーが実際にファイルの一部を再送信する可能性はありますか? このパフォーマンスはどのように改善できますか?
Time with cold NFS cache, without fseek(): ~4 sec
Time with hot NFS cache, without fseek(): ~3 sec
Time with cold NFS cache, with fseek(): ~12 sec
Time with hot NFS cache, with fseek(): ~3 sec
10 ノードのクラスター、コールド NFS キャッシュおよび fseek() を含む 300 MB のファイルを含む nfswatch のスナップショット:
Total packets:
1903459 (network) 544803 (to host) 0 (dropped)
Packet counters:
NFS3 Read: 116290 21%
NFS3 Write: 10 0%
NFS Read: 0 0%
NFS Write: 0 0%
NFS Mount: 0 0%
Port Mapper: 0 0%
RPC Authorization: 29 0%
Other RPC Packets: 0 0%
TCP Packets: 544386 100%
UDP Packets: 17 0%
ICMP Packets: 0 0%
Routing Control: 0 0%
Address Resolution: 0 0%
Reverse Addr Resol: 0 0%
Ethernet Broadcast: 0 0%
Other Packets: 49 0%
10 ノードのクラスター、コールド NFS キャッシュを使用し、fseek() を使用しない 2 GB のファイルを含む nfswatch のスナップショット:
Total packets:
251804 (network) 102650 (to host) 0 (dropped)
Packet counters:
NFS3 Read: 37039 36%
NFS3 Write: 1 0%
NFS Read: 0 0%
NFS Write: 0 0%
NFS Mount: 0 0%
Port Mapper: 0 0%
RPC Authorization: 2 0%
Other RPC Packets: 0 0%
TCP Packets: 102543 100%
UDP Packets: 30 0%
ICMP Packets: 1 0%
Routing Control: 0 0%
Address Resolution: 0 0%
Reverse Addr Resol: 0 0%
Ethernet Broadcast: 0 0%
Other Packets: 41 0%
クライアントは、次のマウント コマンドを使用してマウントされます。
/nfs タイプ nfs の /nfs (rw,rsize=8192,wsize=8192,timeo=14,intr)