>백엔드 개발 >Golang >golang에서 프로세스 모니터링을 구현하는 방법

golang에서 프로세스 모니터링을 구현하는 방법

PHPz
PHPz원래의
2023-04-24 09:10:261912검색

개발, 운영 및 유지 관리 과정에서 프로세스가 정상적으로 실행되고 문제가 발생하면 적시에 감지하고 처리할 수 있는지 확인하기 위해 프로세스를 모니터링해야 하는 경우가 많습니다. 이 글에서는 Go 언어를 사용하여 프로세스 모니터링을 구현하는 방법을 소개하여 모니터링 기술을 더 잘 이해하고 적용하는 데 도움을 드립니다.

1. 프로세스 모니터링의 기본 원칙

프로세스 모니터링은 주로 애플리케이션의 실행 상태를 모니터링, 제어 및 예외 처리하는 기술을 말합니다. 일반인의 관점에서 보면 특정 모니터링 방법을 사용하여 프로그램의 실행 상태를 실시간으로 모니터링하는 동시에 프로그램이 정상적으로 실행되고 적시에 오류를 처리할 수 있는지 확인하는 것입니다.

프로세스 모니터링에서 가장 일반적으로 사용되는 모니터링 방법은 하트비트 메커니즘입니다. 소위 하트비트 메커니즘은 프로그램이 실행되는 동안 외부로 메시지를 지속적으로 보내 정상적인 작동 상태를 나타내는 것입니다. 그리고 이러한 메시지를 캡처하고 구문 분석하여 프로그램이 정상인지 여부를 확인합니다. 프로그램의 이상이 발견되면 그에 따라 처리하여 시스템의 정상적인 작동을 보장합니다.

2. golang의 프로세스 모니터링 구현 아이디어

Go 언어에서는 이미 만들어진 패키지를 사용하여 프로세스 모니터링을 구현할 수 있습니다. 구체적인 구현 단계는 다음과 같습니다.

1. 모든 프로세스 정보 가져오기

psutil 패키지의 프로세스 패키지를 사용하여 시스템의 모든 프로세스에 대한 관련 정보를 가져올 수 있습니다. 먼저 패키지를 소개해야 합니다.

import (
    "github.com/shirou/gopsutil/process"
)

그런 다음 process.Processes() 함수를 호출하여 시스템의 모든 프로세스를 가져옵니다.

processes, err := process.Processes()
if err != nil {
    log.Fatalf("failed to get all processes: %v", err)
}

이 함수는 프로세스 슬라이스를 반환하며, 각 요소는 프로세스를 포함하는 프로세스입니다. 정보 구조. 특정 구조에 대해서는 psutil의 공식 문서를 참조하세요.

2. 모니터링해야 할 프로세스 필터링

특정 프로세스를 모니터링하려면 모든 프로세스 중에서 관심 있는 프로세스를 찾아 해당 pid를 기록해야 합니다. 여기서는 몇 가지 조건부 필터를 사용하여 모니터링해야 하는 프로세스를 빠르게 필터링할 수 있습니다. 예를 들어 프로세스 이름, 프로세스 ID 및 기타 조건을 기반으로 필요한 프로세스를 필터링할 수 있습니다. 프로세스 이름을 예로 들면, 코드는 다음과 같습니다:

targetProcessName := "myApp"
targetPidList := make([]int32, 0)

for _, proc := range processes {
    name, err := proc.Name()
    if err != nil || name != targetProcessName {
        continue
    }
    pid := proc.Pid
    targetPidList = append(targetPidList, pid)
    log.Printf("find target process %s, pid = %d\n", name, pid)
}

3. 모니터링해야 하는 프로세스에 대해 하트비트 감지를 수행합니다.

모니터링이 필요한 프로세스에 대해 다음과 같이 정상적으로 실행되고 있는지 확인할 수 있습니다. 하트비트 메시지를 보냅니다. 구체적으로는 CPU와 메모리 사용량을 읽어 판단할 수 있습니다. CPU와 메모리 사용량이 비정상적인 경우 프로세스에 문제가 있다고 생각할 수 있습니다.

하트비트 감지를 구현하기 위해 고루틴을 사용하여 지정된 프로세스의 상태를 주기적으로 읽고 기록할 수 있습니다. 구체적인 구현 코드는 다음과 같습니다.

type ProcessState struct {
    CpuPercent    float64
    MemResident   uint64
    MemVirtual    uint64
    MemSwap       uint64
}

func checkProcessState(targetPid int32, stateChan chan<- ProcessState) {
    ticker := time.NewTicker(5 * time.Second)
    for {
        select {
        case <-ticker.C:
            proc, err := process.NewProcess(targetPid)
            if err != nil {
                log.Printf("failed to get process %d: %v", targetPid, err)
                continue
            }
            cpuPercent, err := proc.CPUPercent()
            if err != nil {
                log.Printf("failed to get cpu percent for process %d: %v", targetPid, err)
                continue
            }
            memInfo, err := proc.MemoryInfo()
            if err != nil {
                log.Printf("failed to get memory info for process %d: %v", targetPid, err)
                continue
            }
            state := ProcessState{
                CpuPercent:  cpuPercent,
                MemResident: memInfo.RSS,
                MemVirtual:  memInfo.VMS,
                MemSwap:     memInfo.Swap,
            }
            stateChan <- state
        }
    }
}

위 코드에서는 먼저 티커 타이머를 사용하여 5초마다 지정된 프로세스의 상태를 확인합니다. 탐지 과정에서 process.NewProcess() 함수를 통해 지정된 pid의 프로세스 핸들을 얻고, 제공된 함수를 사용하여 CPU 사용량과 메모리 사용량을 얻습니다. 이 정보를 위에서 정의한 구조에 저장하고 stateChan을 통해 외부로 보낸다.

3. 완전한 golang 프로세스 모니터링 코드 예제

위의 구현 아이디어와 코드를 기반으로 완전한 golang 프로세스 모니터링 코드 예제를 작성할 수 있습니다. 전체 코드는 다음과 같습니다.

package main

import (
    "fmt"
    "github.com/shirou/gopsutil/process"
    "log"
    "time"
)

type ProcessState struct {
    CpuPercent    float64
    MemResident   uint64
    MemVirtual    uint64
    MemSwap       uint64
}

func main() {
    targetProcessName := "myApp"
    targetPidList := make([]int32, 0)
    processes, err := process.Processes()
    if err != nil {
        log.Fatalf("failed to get all processes: %v", err)
    }
    for _, proc := range processes {
        name, err := proc.Name()
        if err != nil || name != targetProcessName {
            continue
        }
        pid := proc.Pid
        targetPidList = append(targetPidList, pid)
        log.Printf("find target process %s, pid = %d\n", name, pid)
    }
    stateChan := make(chan ProcessState)
    for _, pid := range targetPidList {
        go checkProcessState(pid, stateChan)
    }
    for {
        select {
        case state := <-stateChan:
            if state.CpuPercent > 100.0 || state.MemSwap > 0 || state.MemVirtual > 2*state.MemResident {
                log.Printf("process is not healthy: %+v\n", state)
            } else {
                log.Printf("process is healthy: %+v\n", state)
            }
        }
    }
}

func checkProcessState(targetPid int32, stateChan chan<- ProcessState) {
    ticker := time.NewTicker(5 * time.Second)
    for {
        select {
        case <-ticker.C:
            proc, err := process.NewProcess(targetPid)
            if err != nil {
                log.Printf("failed to get process %d: %v", targetPid, err)
                continue
            }
            cpuPercent, err := proc.CPUPercent()
            if err != nil {
                log.Printf("failed to get cpu percent for process %d: %v", targetPid, err)
                continue
            }
            memInfo, err := proc.MemoryInfo()
            if err != nil {
                log.Printf("failed to get memory info for process %d: %v", targetPid, err)
                continue
            }
            state := ProcessState{
                CpuPercent:  cpuPercent,
                MemResident: memInfo.RSS,
                MemVirtual:  memInfo.VMS,
                MemSwap:     memInfo.Swap,
            }
            stateChan <- state
        }
    }
}

이 예에서는 먼저 모니터링해야 할 프로세스를 찾고 각 프로세스에 대해 고루틴을 시작하여 상태를 정기적으로 감지합니다. 프로그램은 chan으로부터 고루틴으로부터 상태 메시지를 지속적으로 수신하고, 그 상태에 따라 프로그램이 정상적으로 실행되고 있는지 판단합니다. 프로세스에 이상이 발견되면 로그를 통해 해당 프롬프트를 제공합니다.

4. 요약

이 글에서는 주로 psutil 패키지에 제공되는 API를 호출하고 정기적인 탐지를 위해 goroutine을 사용하여 Go 언어를 사용하여 프로세스 모니터링을 구현하는 방법을 소개합니다. 프로세스 모니터링을 통해 애플리케이션의 실행 상태를 더 잘 제어하고 프로그램에서 예외가 발생할 때 적시에 처리할 수 있어 시스템 개발과 운영 및 유지 관리를 더 잘 구현하는 데 도움이 됩니다.

위 내용은 golang에서 프로세스 모니터링을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.