diff options
| author | linxin <[email protected]> | 2023-05-19 18:12:17 +0800 |
|---|---|---|
| committer | linxin <[email protected]> | 2023-05-19 18:12:17 +0800 |
| commit | ccc9eea97b1f8b9ffa4fb14b7c00c514108e7ee5 (patch) | |
| tree | 1123b97d1f4eb23d16ccbe78dd62ece9c833533b /coredump-handler | |
| parent | 9ca3746fce2178a0ce8b9189ca9b1c28b2496715 (diff) | |
修改handler写coredump大文件分块写入降低内存使用
Diffstat (limited to 'coredump-handler')
| -rw-r--r-- | coredump-handler/coredump-handler.go | 57 |
1 files changed, 52 insertions, 5 deletions
diff --git a/coredump-handler/coredump-handler.go b/coredump-handler/coredump-handler.go index 58c2e38..c30a7d8 100644 --- a/coredump-handler/coredump-handler.go +++ b/coredump-handler/coredump-handler.go @@ -162,22 +162,50 @@ func writeCoreDumpToFile(config types.Coredump_config) error { return err } defer file.Close() - + buf := make([]byte, 1024*1024) + data := make([]byte, 1024*1024) // create a pipe to write file reader, writer := io.Pipe() go func() { defer writer.Close() - io.Copy(writer, os.Stdin) + // io.Copy(writer, os.Stdin) + for { + // 从标准输入中读取数据块 + n, err := os.Stdin.Read(buf) + if err != nil { + journal.Print(journal.PriErr, err.Error()) + writer.Close() + return + } + // 将读取的数据块写入到管道中 + _, err = writer.Write(buf[:n]) + if err != nil { + journal.Print(journal.PriErr, err.Error()) + return + } + } }() - io.Copy(file, reader) + for { + // 从管道中读取数据,直到管道被关闭 + _, err = io.CopyBuffer(file, reader, data) + if err != nil { + if err != io.EOF { + return err + } + break + } + _, err = file.Write(data) + if err != nil { + return err + } + } return nil } func writeMiniDumpToFile(config types.Coredump_config) error { filename := fmt.Sprintf("%s/%s_%s_%d.minidump", config.Storage, config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp) cmd := exec.Command("/opt/tsg/coredump/bin/core_handler", config.Initial_ns_pid, filename) cmd.Stdin = os.Stdin - // 获取 Python 脚本的输出 output, err := cmd.Output() if err != nil { return err @@ -203,12 +231,31 @@ func compress(config types.Coredump_config) error { Name: filename, Method: zip.Deflate, } + // Write the header to the zip file. writer, err := zipwriter.CreateHeader(header) if err != nil { return err } - io.Copy(writer, os.Stdin) + + // Set the block size to 1 megabyte. + const blockSize = 1024 * 1024 + + // Read and write the input in blocks. + buf := make([]byte, blockSize) + for { + n, err := os.Stdin.Read(buf) + if err != nil && err != io.EOF { + return err + } + if n == 0 { + break + } + _, err = writer.Write(buf[:n]) + if err != nil { + return err + } + } return nil } |
