首页 > 解决方案 > Ubuntu 不使用非活动内存并进行交换。为什么?

问题描述

我有什么: 1. Ubuntu 16.4 (VPS)。2.空闲内存:

免费-m

              total        used        free      shared  buff/cache   available
Mem:           2048         916           0         251     1131         930
Swap:           512         183         328

零,但可用 930。那是什么?

让我们检查一下 meminfo。

猫 /proc/meminfo

MemTotal:        2097152 kB
MemFree:               0 kB
Cached:          1092204 kB
Buffers:               0 kB
Active:           926032 kB
Inactive:        1003456 kB
Active(anon):     358948 kB
Inactive(anon):   478336 kB
Active(file):     567084 kB
Inactive(file):   525120 kB
Unevictable:        4440 kB
Mlocked:           16716 kB
SwapTotal:        524288 kB
SwapFree:         337304 kB
Dirty:              3664 kB
Writeback:             0 kB
AnonPages:        837284 kB
Shmem:            257492 kB
Slab:              69176 kB
SReclaimable:      51680 kB
SUnreclaim:        17496 kB

我们可以在这里查看非活动内存。这就对了。Ubuntu 使用 PageCache 机制将磁盘中的页面存储在内存中。它从磁盘加载数据,将其保存在内存中,并在需要时从内存中提供。活跃意味着频繁,非活跃意味着一旦加载并且可以在需要时释放并用于其他原因。在释放之前,如果它有更改,则此更改应存储在磁盘中。听起来很不错,应该很快!

  1. 我们在这个内存中有什么数据?

我有一个有很多图片的网站,搜索机器人总是搜索一些东西并打开很多页面。因此,我假设这主要是缓存在内存中的图像。让我们用 vmtouch 检查一下:

vmtouch 上传/

           Files: 947554
     Directories: 452
  Resident Pages: 336841/7859937  1G/29G  4.29%
         Elapsed: 15.938 seconds

它看起来像 1 GB 缓存!好的。一切看起来都是正确的。当然不只是图片,图片可以占用这 1GB 的磁盘空间。

问题: 我已经安装了监控collectd。当我打开交换信息时,我看到了奇怪的东西。

收集

蓝线表示换出。换出是指系统获取 Page 并将其存储在磁盘上,然后将释放的内存用于其他工作。但它应该使用非活动内存!它应该释放非活动内存并且不进行交换。

这条蓝线每 5 分钟一次。sphinx 的 cron 运行的时间。命令是:

索引器 --all --rotate

它对 3 个索引进行索引。每个都使用 MySQL 运行查询。表有大约 40.000 条记录要索引,所有这些记录都拆分为 3 个索引。

内存的使用情况如下所示:

记忆

有时系统会释放内存。它看起来像图像上的绿色三角形空间。它比使用 PageCache 感觉更自由。

我将显示 ps 命令的内存使用情况(输出的一部分):

ps辅助--排序-rss

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mysql    25736 48.9 18.9 2587348 396632 ?      Sl   Aug01 2130:22 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
sphinxs+   352  0.1  1.8 543592 39784 ?        Sl   May01 209:07 /usr/bin/searchd
www-data 11926  1.3  1.4 388392 29636 ?        S    15:28   0:02 php /var/www/html/ma-ideals.com/index.php -p fb -t 10
www-data 11322  0.1  0.7 449716 16568 ?        S    15:06   0:02 php-fpm: pool www
www-data 11761  0.2  0.7 449716 15812 ?        S    15:21   0:01 php-fpm: pool www
www-data 11535  0.1  0.7 449716 15432 ?        S    15:12   0:01 php-fpm: pool www
www-data 11338  0.1  0.7 449712 15320 ?        S    15:07   0:02 php-fpm: pool www
www-data 11478  0.1  0.6 447664 14548 ?        S    15:10   0:02 php-fpm: pool www

有人可以帮助我更深入地研究这个换出背后发生的事情以及为什么 ubuntu 在这个操作中没有使用非活动内存吗?

标签: memoryubuntu-16.04swap

解决方案


小交换有什么问题?如果内核可以找到非常冷的页面,为什么要让它们浪费内存?

似乎有很多关于交换的迷信——人们虔诚地相信没有它的系统会更好,等等。事实上,交换只是优化你的内存使用。Swapout对系统有好处,因为它使物理内存可用于更重要的用途。OTOH,如果您看到非平凡的 swapIN,那么您可能会遇到问题(但这不是进行交换或经历适度的交换所固有的。)


推荐阅读