mirror of
				https://github.com/minio/minio.git
				synced 2025-10-29 15:55:00 -04:00 
			
		
		
		
	bit-rot: Default to sha256 on ARM64. (#3488)
This is to utilize an optimized version of sha256 checksum which @fwessels implemented. blake2b lacks such optimizations on ARM platform, this can provide us significant boost in performance. blake2b on ARM64 as expected would be slower. ``` BenchmarkSize1K-4 30000 44015 ns/op 23.26 MB/s BenchmarkSize8K-4 5000 335448 ns/op 24.42 MB/s BenchmarkSize32K-4 1000 1333960 ns/op 24.56 MB/s BenchmarkSize128K-4 300 5328286 ns/op 24.60 MB/s ``` sha256 on ARM64 is faster by orders of magnitude giving close to AVX performance of blake2b. ``` BenchmarkHash8Bytes-4 1000000 1446 ns/op 5.53 MB/s BenchmarkHash1K-4 500000 3229 ns/op 317.12 MB/s BenchmarkHash8K-4 100000 14430 ns/op 567.69 MB/s BenchmarkHash1M-4 1000 1640126 ns/op 639.33 MB/s ```
This commit is contained in:
		
							parent
							
								
									1ac36a95aa
								
							
						
					
					
						commit
						5878fcc086
					
				| @ -24,6 +24,7 @@ import ( | |||||||
| 	"sync" | 	"sync" | ||||||
| 
 | 
 | ||||||
| 	"github.com/klauspost/reedsolomon" | 	"github.com/klauspost/reedsolomon" | ||||||
|  | 	"github.com/minio/sha256-simd" | ||||||
| 	"golang.org/x/crypto/blake2b" | 	"golang.org/x/crypto/blake2b" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| @ -37,23 +38,26 @@ func newHashWriters(diskCount int, algo string) []hash.Hash { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // newHash - gives you a newly allocated hash depending on the input algorithm. | // newHash - gives you a newly allocated hash depending on the input algorithm. | ||||||
| func newHash(algo string) hash.Hash { | func newHash(algo string) (h hash.Hash) { | ||||||
| 	switch algo { | 	switch algo { | ||||||
|  | 	case "sha256": | ||||||
|  | 		// sha256 checksum specially on ARM64 platforms or whenever | ||||||
|  | 		// requested as dictated by `xl.json` entry. | ||||||
|  | 		h = sha256.New() | ||||||
| 	case "blake2b": | 	case "blake2b": | ||||||
| 		// ignore the error, because New512 without a key never fails | 		// ignore the error, because New512 without a key never fails | ||||||
| 		// New512 only returns a non-nil error, if the length of the passed | 		// New512 only returns a non-nil error, if the length of the passed | ||||||
| 		// key > 64 bytes - but we use blake2b as hash fucntion (no key) | 		// key > 64 bytes - but we use blake2b as hash fucntion (no key) | ||||||
| 		h, _ := blake2b.New512(nil) | 		h, _ = blake2b.New512(nil) | ||||||
| 		return h |  | ||||||
| 	// Add new hashes here. | 	// Add new hashes here. | ||||||
| 	default: | 	default: | ||||||
| 		// Default to blake2b. | 		// Default to blake2b. | ||||||
| 		// ignore the error, because New512 without a key never fails | 		// ignore the error, because New512 without a key never fails | ||||||
| 		// New512 only returns a non-nil error, if the length of the passed | 		// New512 only returns a non-nil error, if the length of the passed | ||||||
| 		// key > 64 bytes - but we use blake2b as hash fucntion (no key) | 		// key > 64 bytes - but we use blake2b as hash fucntion (no key) | ||||||
| 		h, _ := blake2b.New512(nil) | 		h, _ = blake2b.New512(nil) | ||||||
| 		return h |  | ||||||
| 	} | 	} | ||||||
|  | 	return h | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Hash buffer pool is a pool of reusable | // Hash buffer pool is a pool of reusable | ||||||
|  | |||||||
| @ -20,6 +20,7 @@ import ( | |||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
| 	"errors" | 	"errors" | ||||||
| 	"path" | 	"path" | ||||||
|  | 	"runtime" | ||||||
| 	"sort" | 	"sort" | ||||||
| 	"sync" | 	"sync" | ||||||
| 	"time" | 	"time" | ||||||
| @ -54,9 +55,28 @@ type checkSumInfo struct { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Constant indicates current bit-rot algo used when creating objects. | // Constant indicates current bit-rot algo used when creating objects. | ||||||
| const ( | // Depending on the architecture we are choosing a different checksum. | ||||||
| 	bitRotAlgo = "blake2b" | var bitRotAlgo = getDefaultBitRotAlgo() | ||||||
| ) | 
 | ||||||
|  | // Get the default bit-rot algo depending on the architecture. | ||||||
|  | // Currently this function defaults to "blake2b" as the preferred | ||||||
|  | // checksum algorithm on all architectures except ARM64. On ARM64 | ||||||
|  | // we use sha256 (optimized using sha2 instructions of ARM NEON chip). | ||||||
|  | func getDefaultBitRotAlgo() string { | ||||||
|  | 	switch runtime.GOARCH { | ||||||
|  | 	case "arm64": | ||||||
|  | 		// As a special case for ARM64 we use an optimized | ||||||
|  | 		// version of hash i.e sha256. This is done so that | ||||||
|  | 		// blake2b is sub-optimal and slower on ARM64. | ||||||
|  | 		// This would also allows erasure coded writes | ||||||
|  | 		// on ARM64 servers to be on-par with their | ||||||
|  | 		// counter-part X86_64 servers. | ||||||
|  | 		return "sha256" | ||||||
|  | 	default: | ||||||
|  | 		// Default for all other architectures we use blake2b. | ||||||
|  | 		return "blake2b" | ||||||
|  | 	} | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| // erasureInfo - carries erasure coding related information, block | // erasureInfo - carries erasure coding related information, block | ||||||
| // distribution and checksums. | // distribution and checksums. | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user