Linux:使用的总交换=进程使用的交换+?


17

因此,我试图对交换使用率高的系统中的交换使用来自何处进行调查:

# free
             total       used       free     shared    buffers     cached
Mem:        515324     508800       6524          0       4852      27576
-/+ buffers/cache:     476372      38952
Swap:       983032     503328     479704

加总每个进程使用的交换:

# for proc in /proc/*; do cat $proc/smaps 2>/dev/null | awk '/Swap/{swap+=$2}END{print swap "\t'`readlink $proc/exe`'"}'; done | sort -n | awk '{total+=$1}/[0-9]/;END{print total "\tTotal"}'
0       /bin/gawk
0       /bin/sort
0       /usr/bin/readlink
28      /sbin/xxxxxxxx
52      /sbin/mingetty
52      /sbin/mingetty
52      /sbin/mingetty
52      /sbin/mingetty
56      /sbin/mingetty
56      /sbin/mingetty
60      /xxxxxxxxxxx
60      /usr/sbin/xxx
84      /usr/sbin/xxx
108     /usr/bin/xxx
168     /bin/bash
220     /sbin/init
256     /sbin/rsyslogd
352     /bin/bash
356     /bin/bash
360     /usr/sbin/sshd
496     /usr/sbin/crond
672     /usr/sbin/sshd
12972   /opt/jdk1.6.0_22/bin/java
80392   /usr/libexec/mysqld
311876  /opt/jdk1.6.0_22/bin/java
408780  Total

这将为总已用交换量提供较低的值。剩余的已用交换空间在哪里?内核内部是否有vmalloc()的内存?还有别的吗 如何识别?

meminfo的输出:

# cat /proc/meminfo 
MemTotal:       515324 kB
MemFree:          6696 kB
Buffers:          5084 kB
Cached:          28056 kB
SwapCached:     157512 kB
Active:         429372 kB
Inactive:        65068 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:       515324 kB
LowFree:          6696 kB
SwapTotal:      983032 kB
SwapFree:       478712 kB
Dirty:             100 kB
Writeback:           0 kB
AnonPages:      399456 kB
Mapped:           8792 kB
Slab:             7744 kB
PageTables:       1820 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   1240692 kB
Committed_AS:  1743904 kB
VmallocTotal:   507896 kB
VmallocUsed:      3088 kB
VmallocChunk:   504288 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     4096 kB

包括缓冲区和高速缓存,它们不与任何进程关联。
goldilocks 2013年

2
@goldilocks:不,它们在物理内存中。而且,它们不累加。
ninj 2013年

没错,我想将要交换的缓存内容毫无意义。但是,我认为被交换出去的东西即使在拥有的进程终止后也可以留在那里并进行跟踪,只要不需要交换空间即可。如果一个进程加载相同的页面,然后又需要换出该页面,则可以节省时间,因为该页面仍在交换中。Google的“交换缓存” linux-tutorial.info/modules.php?name=MContent&pageid=314 这与实际的“缓存缓存”的实现方式相似(它是从现已失效的进程中保存在内存中的东西)。
goldilocks 2013年

...意思是,大声笑,“ 交换中缓存内容”并不是没有意义的,只是它不能通过交换RAM缓存到达那里。
goldilocks 2013年

1
答案不仅仅在于内核可以交换,而是不包含在您的处理中吗?特别是如今,内核拥有一堆“用户空间”进程。
iain

Answers:


11

您观察到的差异实际上并不是由于交换空间不足而引起的。内核有时附加到/proc/*/exe链接的“(已删除)” 由readlinkawk脚本输出并引起解析错误,实际上,您没有在计算二进制中不再存在其二进制数的进程。

/proc/*/exe当该进程的原始可执行文件不再存在时,某些内核会在单词符号链接目标后附加单词“((已删除)”)。

您的命令显示的总数少于总数的原因是因为此。readlink这样的链接上的输出将类似于“ / path / to / bin(已删除)”,这会在awk将输出替换回字符串中时引起解析错误(它不喜欢括号和空格)。例如,执行以下操作:

for a in /proc/*/exe ; do readlink $a ; done | grep deleted

您将看到一些附加了“(已删除)”的条目。如果您查看这些条目的交换使用情况,它们的总数将与您看到的差异相匹配,因为由此产生的awk错误将阻止计算它们的总数并将其包括在最终总数中。

如果您运行原始命令时未将stderr重定向到任何地方,则可能会注意到一些“字符串失控”错误。这些错误是上述情况的结果,您不应忽略它们。

忽略对原始命令的其他潜在改进,您可以通过删除“(已删除)”来修改它,如下所示(|awk '{print $1}'readlink输出中添加注释):

for proc in /proc/*; \
  do cat $proc/smaps 2>/dev/null | awk '/Swap/{swap+=$2}END{print swap "\t'`readlink $proc/exe|awk '{print $1}' `'" }'; \
done | sort -n | awk '{total+=$1}/[0-9]/;END{print total "\tTotal"}'

这种使用的awk固定输出的readlink,如果名称中包含空格可能会破坏-你可以使用sed或任何你喜欢的方法。

奖金信息

顺便说一句,您可以使用smem -t。“交换”列显示所需内容。

不过,对于您自己进行计算,您也可以直接从VmSwap字段中获取此信息/proc/*/status(smaps需要一些内核支持,并且并不总是可用),并且可以避免使用非正确的文件名模式来重定向错误输出。错误开始于:

for proc in /proc/[0-9]*; do \
  awk '/VmSwap/ { print $2 "\t'`readlink $proc/exe | awk '{ print $1 }'`'" }' $proc/status; \
done | sort -n | awk '{ total += $1 ; print $0 } END { print total "\tTotal" }'

如果您不需要实际的二进制文件并且只需要具有进程名称就可以处理,您可以从中获取所有信息status

for a in /proc/*/status ; do \
  awk '/VmSwap|Name/ { printf $2 " " } END { print "" }' $a ; \
done | awk '{ total+=$2 ; print $0 } END { print "Total " total }'

最后,如果仅使用PID就足够了,则可以使用以下方法完成所有操作awk

awk '/VmSwap/ { total += $2; print $2 "\t" FILENAME } END { print total "\tTotal" }' /proc/*/status

注意:

现在,这并不是说free和之间没有区别smem(后者与您的脚本相同)。有很多(例如,请参阅https://www.google.com/search?q=smem+free,其首页上的结果足以回答有关内存使用的问题)。但是,如果没有适当的测试,您的具体情况将无法得到解决。


5

如果内核需要更多的可用RAM,或者仅仅是因为它有一段时间未使用,则tmpfs也会使用Swap ...因此,任何tmpfs的使用都可能会消耗掉swap。


1
为什么要下票?这是绝对正确的。
jlliagre
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.