linux - 进程退出后内存仍在使用
问题描述
我有一个关于奇怪事件的问题,我在一个 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 进程,结果它奏效了。问题解决了,我把这个问题留在这里,希望它对其他人有用。
解决方案
我认识的人告诉我,拥有这么多 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)
}
推荐阅读
- javascript - 如果参数为负,我如何返回错误?
- typescript - debug-vuejs-from-vs-code:在 chrome 中调试 vueJS 应用程序时未绑定断点
- node.js - Azure Function Node 应用 NPM 依赖项未解析
- java - JPackage 不生成工作 exe 和 bugs 文件夹
- java - 未能执行目标 org.springframework.boot:spring-boot-maven-plugin:2.5.5:run (default-cli)
- django - 英国的正确 LANGUAGE_CODE 是什么?
- c++ - 在 std::cin 中一次输入多个参数会导致程序失败 - 为什么?
- python - 在anaconda中创建环境时出错
- pdf - plotly pdf导出更改字体样式
- selenium-webdriver - Mac 中用于文件上传的机器人类