Closed kawasin73 closed 6 years ago
syscall.Mmap()
でファイルをマッピングしたメモリにレコードを順に追記する処理のパフォーマンスがバッファメモリのサイズ(cachesize
)によってどのように変わるかを比較した。ファイルの最後に来た場合はリングバッファのように周回する。
10MB
、100MB
、1GB
のファイルサイズそれぞれについて、レコードサイズは 10B
、100B
、1KB
、2KB
の4種類を試行し、キャッシュサイズは キャッシュなし
、100B
、1KB
、2KB
、4KB
、8KB
、12KB
、16KB
、1MB
の9種類を試行した。
キャッシュサイズがレコードサイズ以下となる場合はキャッシュなしとして(無駄ではあるが)試行した。
この一連のベンチマークを macOS + SSD
、macOS + HDD
、Ubuntu on EC2 + SSD
、Ubuntu on EC2 + HDD
の4つのデバイスで実行した。
結果は長いため、考察の後に記載する。
キャッシュサイズが小さい場合はディスク操作の回数が増えるため、キャッシュサイズが増えるほどパフォーマンスが向上すると考えられる。
一方、キャッシュサイズが大きすぎるとメモリコピーの回数が レコード -> キャッシュ
と キャッシュ -> ファイル
の 2 回に増えるオーバーヘッドの影響が大きくなり、パフォーマンスが低下する。
手元の MacBook Pro では、どのレコードサイズでもバッファのサイズが ワードサイズの 2 ~ 3 倍 で書き込みパフォーマンスが極大化した。
EC2 上で動く Ubuntu ではバッファのサイズが ワードサイズの 3 ~ 4 倍 で急激にパフォーマンスが改善するが、ファイルサイズが 1GB でレコードサイズが 1KB を超えるとき、バッファのサイズが 1MB
の方がより大きな最大パフォーマンスを計測することができた。
よって、バッファリングを行うことで mmap 経由での書き込みパフォーマンスは向上する が、最適なバッファサイズは 1 レコードのサイズと実行するマシンによって異なる ことがわかるが、大体のケースでは ワードサイズの 2 ~ 4 倍 程度のバッファサイズが良いパフォーマンスを出すと推測できる。
またバッファサイズとは関係ないが、ファイルサイズが大きくなるにつれて書き込みパフォーマンスが低下する傾向にあり、特にファイルサイズが 1GB で、EC2 インスタンスで試行したときにパフォーマンスの劣化が顕著である。 これは、 ページアウトが頻繁に発生 したためであると考えられる。ファイルサイズが大きいほど Mmap のページアウトが発生する頻度が増し、またEC2 はマシンメモリが 1GB と小さいためページアウトが発生する頻度が増えたものであると考えられる。
それぞれのデバイスでの結果は以下の通りである。 また、データグラフの原本は こちらのスプレッドシート で公開している。
項目 | 内容 |
---|---|
OS | macOS 10.12.6 |
Disk | APPLE SSD SM0512G |
PC | MacBook Pro (Retina, 13-inch, Early 2015) |
Page Size | 4096 B |
Go Version | 1.10.1 |
項目 | 内容 |
---|---|
OS | macOS 10.12.6 |
Disk | StoreJet Transcend (HDD) |
PC | MacBook Pro (Retina, 13-inch, Early 2015) |
Page Size | 4096 B |
Go Version | 1.10.1 |
項目 | 内容 |
---|---|
AMI | Ubuntu Server 18.04 LTS (HVM), SSD Volume Type - ami-07ad4b1c3af1ea214 |
Instance | t2.micro |
Disk | SSD(gp2) |
Page Size | 4096 B |
Go Version | 1.10.1 |
項目 | 内容 |
---|---|
AMI | Ubuntu Server 18.04 LTS (HVM), SSD Volume Type - ami-07ad4b1c3af1ea214 |
Instance | t2.micro |
Disk | HDD(standard) |
Page Size | 4096 B |
Go Version | 1.10.1 |
レコードを追記する場合に、1件ごと Mmap された領域へコピーする場合と、バッファリングして複数件を一度にコピーする場合でどの程度パフォーマンスに開きがあるのか調査する