// Benchmark the read speed of the underlying block device for a given file. func main() { pathname := "/" if len(os.Args) == 2 { pathname = os.Args[1] } bytesPerSecond, blocksPerSecond, err := fsbench.GetReadSpeed(pathname) if err != nil { fmt.Printf("Error! %s\n", err) return } ctx := fsrateio.NewContext(bytesPerSecond, blocksPerSecond) fmt.Println(ctx) var file *os.File file, err = os.Open(pathname) if err != nil { fmt.Printf("Error! %s\n", err) return } rd := bufio.NewReader(fsrateio.NewReader(file, ctx)) buffer := make([]byte, 65536) timeStart := time.Now() tread := 0 for { n := 0 n, err = rd.Read(buffer) if n < 1 && err == io.EOF { break } if err != nil { fmt.Printf("Error! %s\n", err) return } tread += n } bytesPerSecond = uint64(float64(tread) / time.Since(timeStart).Seconds()) fmt.Printf("%s/s\n", fsrateio.FormatBytes(bytesPerSecond)) }
func main() { flag.Parse() var err error bytesPerSecond, blocksPerSecond, err := fsbench.GetReadSpeed(*rootDir) if err != nil { fmt.Printf("Error! %s\n", err) return } ctx := fsrateio.NewContext(bytesPerSecond, blocksPerSecond) if *scanSpeed != 0 { ctx.SetSpeedPercent(*scanSpeed) } fmt.Println(ctx) syscall.Setpriority(syscall.PRIO_PROCESS, 0, 10) var prev_fs *scanner.FileSystem sleepDuration, _ := time.ParseDuration(fmt.Sprintf("%ds", *interval)) for iter := 0; *numScans < 0 || iter < *numScans; iter++ { timeStart := time.Now() fs, err := scanner.ScanFileSystem(*rootDir, *objectCache, ctx) timeStop := time.Now() if iter > 0 { fmt.Println() } if err != nil { fmt.Printf("Error! %s\n", err) return } fmt.Print(fs) fmt.Printf("Total scanned: %s,\t", fsrateio.FormatBytes(fs.TotalDataBytes)) bytesPerSecond := uint64(float64(fs.TotalDataBytes) / timeStop.Sub(timeStart).Seconds()) fmt.Printf("%s/s\n", fsrateio.FormatBytes(bytesPerSecond)) if prev_fs != nil { if !scanner.Compare(prev_fs, fs, os.Stdout) { fmt.Println("Scan results different from last run") } } runtime.GC() // Clean up before showing memory statistics. memstats.WriteMemoryStats(os.Stdout) if *debugFile != "" { file, err := os.Create(*debugFile) if err != nil { fmt.Printf("Error! %s\n", err) return } w := bufio.NewWriter(file) fs.DebugWrite(w, "") w.Flush() file.Close() } if *rpcFile != "" { file, err := os.Create(*rpcFile) if err != nil { fmt.Printf("Error creating: %s\t%s\n", *rpcFile, err) os.Exit(1) } encoder := gob.NewEncoder(file) encoder.Encode(fs) file.Close() } prev_fs = fs time.Sleep(sleepDuration) } }
func main() { flag.Parse() workingRootDir := path.Join(*subdDir, "root") objectsDir := path.Join(*subdDir, "objects") tmpDir := path.Join(*subdDir, "tmp") if !createDirectory(workingRootDir) { os.Exit(1) } if !sanityCheck() { os.Exit(1) } if !createDirectory(objectsDir) { os.Exit(1) } if !createDirectory(tmpDir) { os.Exit(1) } if !mountTmpfs(tmpDir) { os.Exit(1) } if !unshareAndBind(workingRootDir) { os.Exit(1) } bytesPerSecond, blocksPerSecond, firstScan, ok := getCachedSpeed( workingRootDir, tmpDir) if !ok { os.Exit(1) } ctx := fsrateio.NewContext(bytesPerSecond, blocksPerSecond) defaultSpeed := ctx.SpeedPercent() if firstScan { ctx.SetSpeedPercent(100) } if *showStats { fmt.Println(ctx) } var fsh scanner.FileSystemHistory fsChannel := scanner.StartScannerDaemon(workingRootDir, objectsDir, ctx) err := httpd.StartServer(*portNum, &fsh) if err != nil { fmt.Printf("Unable to create http server\t%s\n", err) os.Exit(1) } fsh.Update(nil) for iter := 0; true; iter++ { if *showStats { fmt.Printf("Starting cycle: %d\n", iter) } fsh.Update(<-fsChannel) runtime.GC() // An opportune time to take out the garbage. if *showStats { fmt.Print(fsh) fmt.Print(fsh.FileSystem()) memstats.WriteMemoryStats(os.Stdout) fmt.Println() } if firstScan { ctx.SetSpeedPercent(defaultSpeed) firstScan = false if *showStats { fmt.Println(ctx) } } } }