首页 > 解决方案 > 进程退出后内存仍在使用

问题描述

我有一个关于奇怪事件的问题,我在一个 1GB 内存的服务器上,我只运行一个轻量级的应用程序,一段时间后它的内存使用量增加了(可能我还没有发现内存泄漏),但这是另一个故事,问题是,当它使用太多内存时,我退出进程,令我惊讶的是内存使用率仍然很高,怎么可能?内存没有被缓存,它是正在使用的“原始”内存,但 htop 似乎也不知道哪个进程正在使用它......
在这里我附上图像以便您看到它,它按内存使用量降序排序。如果使用最多内存的进程使用 1.8%,我不明白内存使用量是 751MB。
我已经阅读了一些解决方案,例如禁用交换,但如图所示,交换被禁用。

在此处输入图像描述

更新 1

在这里我附上meminfo:

MemTotal:        1004852 kB
MemFree:          108456 kB
MemAvailable:      97392 kB
Buffers:            2768 kB
Cached:            31868 kB
SwapCached:            0 kB
Active:           503268 kB
Inactive:          15100 kB
Active(anon):     491920 kB
Inactive(anon):     2852 kB
Active(file):      11348 kB
Inactive(file):    12248 kB
Unevictable:       18516 kB
Mlocked:           18516 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                20 kB
Writeback:             0 kB
AnonPages:        502288 kB
Mapped:            28200 kB
Shmem:              2856 kB
KReclaimable:      96860 kB
Slab:             308536 kB
SReclaimable:      96860 kB
SUnreclaim:       211676 kB
KernelStack:        5676 kB
PageTables:        11836 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      502424 kB
Committed_AS:     808208 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       12656 kB
VmallocChunk:          0 kB
Percpu:             1772 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      501740 kB
DirectMap2M:      546816 kB

在https://unix.stackexchange.com/questions/524846/why-does-my-system-use-more-ram-after-an-hour-of-usage上有一个关于释放缓存内存的有趣解决方案,但在这里不起作用,问题不是缓存内存...

更新 2

我认识的人告诉我,拥有这么多 sshd 进程很奇怪,我尝试杀死所有那些 root@notty sshd 进程,结果它奏效了。问题解决了,我把这个问题留在这里,希望它对其他人有用。

标签: linuxadminadministration

解决方案


我认识的人告诉我,拥有这么多 sshd 进程很奇怪,我尝试杀死所有那些 root@notty sshd 进程,结果它奏效了。问题解决了,我把这个问题留在这里,希望它对其他人有用。为了简化过程,我使用了以下 Golang 代码:


import (
    "github.com/shirou/gopsutil/v3/process"
    "fmt"
    "strings"
)

func main() {
    processes, err := process.Processes()
    if err != nil {
        panic(err)
    }
    sshCount := 0
    for i := 0; i < len(processes); i++ {
        currentProcess := processes[i]
        name, err := currentProcess.Name()
        if err != nil {
            fmt.Printf("Failed to retrieve the name of process %d\n", currentProcess.Pid)
            continue
        }

        // username, err := currentProcess.Username()
        cmdLine, err := currentProcess.Cmdline()
        // cwd, _ := currentProcess.Cwd()
        // terminalStr, _ := currentProcess.Terminal()

        if strings.Contains(name, "sshd") && cmdLine == "sshd: root@notty" {
            sshCount++
            err = currentProcess.Terminate()
            if err != nil {
                fmt.Printf("Error on terminating %d %s\n", currentProcess.Pid, name)
                err = currentProcess.Kill()
                if err != nil {
                    fmt.Printf("Error on Killing %d %s\n", currentProcess.Pid, name)
                } else {
                    fmt.Printf("Killed %d %s\n", currentProcess.Pid, name)
                }
            } else {
                fmt.Printf("Terminated successfully %d %s\n", currentProcess.Pid, name)
            }
        }
    }

    fmt.Printf("We got %d sshd processes\n", sshCount)
}

推荐阅读