summaryrefslogtreecommitdiff
path: root/coredump-handler
diff options
context:
space:
mode:
authorlinxin <[email protected]>2023-05-19 18:12:17 +0800
committerlinxin <[email protected]>2023-05-19 18:12:17 +0800
commitccc9eea97b1f8b9ffa4fb14b7c00c514108e7ee5 (patch)
tree1123b97d1f4eb23d16ccbe78dd62ece9c833533b /coredump-handler
parent9ca3746fce2178a0ce8b9189ca9b1c28b2496715 (diff)
修改handler写coredump大文件分块写入降低内存使用
Diffstat (limited to 'coredump-handler')
-rw-r--r--coredump-handler/coredump-handler.go57
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
}