限制
cgroup可以用于限制容器的working set和rss。
Working Set:容器的Working Set是指在一段时间内活跃使用的物理内存总量。它包括正在使用的内存页和最近被访问的内存页。通过限制Working Set,可以控制容器可用的物理内存量,以便在系统资源有限的情况下提高性能和稳定性。
RSS(Resident Set Size):容器的RSS是指容器进程当前使用的物理内存总量。它包括所有分配给容器进程的内存页,无论这些内存页是否被活动使用。通过限制RSS,可以确保容器不会超出一定的物理内存限制,以防止容器过度消耗系统资源。
因此,cgroup可以用来限制容器的Working Set和RSS,从而对容器的内存使用进行管控。
查看目前使用
free -h 查看到的是宿主机的内存,需要使用docker stats 查看。
select * from gs_total_memory_detail;
cat /sys/fs/cgroup/memory/memory.stat
grep Rss /proc/374/smaps | awk '{sum+=$2}END{print sum}'
ps -ef|grep vastbase
cat /proc/374/statm
cat /proc/meminfo
以下是对给出的内存信息参数的解析:
MemTotal
: 系统中所有可用RAM的大小(单位:kB)。此处,总量为32,935,664 kB,约等于31.4 GB。MemFree
: 当前未使用的RAM大小。该系统目前有大约346,336 kB,即338 MB的空闲内存。MemAvailable
: 估计可以供应用程序使用(而不进入交换)的内存量,以 kB 为单位。这是最能反映系统内存容量情况的指标之一。Buffers
: 用作缓冲的内存大小。Cached
: 被缓存的内存大小,包含了Buffers的大小。SwapCached
: 被交换出去的内存,但仍然被缓存的大小,所以在需要这部分内存内容时,直接从swapCached读取,而不必再从swap device上耗费IO去读取。Active
: 正在使用或者很短时间内被使用过的内存。Inactive
: 一段时间内没有被使用的内存。长期不用的数据就会被搬运到这里。Active(anon)
: 匿名页和/proc/kpagecount中回引用的页框数相等,不包括tmpfs(Shmem)Inactive(anon)
: 如上,但是这些页框位于LRU的inactive list上。Active(file)
,Inactive(file)
: 类似于Active和Inactive,但这些页包含了现在已经缓存的所有文件(例如,来自扩展3/4的普通和目录项缓存)Unevictable
: 不可回收的内存。Mlocked和ipc shm的页面会在此处进行计数。SwapTotal
,SwapFree
: 分别表示系统中总的交换空间大小和空闲交换空间大小。这里显示为0,意味着没有启用交换空间。Dirty
: 等待被写回到磁盘的内存大小。AnonPages
: 未映射页框的数量。Mapped
: 所有设备和文件系统等映射的大小总和。Shmem
: tmpfs(Shmem)和sysv IPC所使用的内存量Slab
: 内核数据结构缓存的大小,可以减少常见数据结构的创建和销毁带来的开销。SReclaimable
,SUnreclaim
: Slab缓存中可回收和不可回收的内存大小。KernelStack
: 内核栈的大小。PageTables
: 管理内存分页的页面表的大小。Committed_AS
: Estimation of how much RAM the system would need under worst case scenario.VmallocTotal
,VmallocUsed
,VmallocChunk
: 表示虚拟内存的总量,已使用的虚拟内存,以及最大连续的虚拟内存块。Percpu
: 每个CPU的数据结构大小总和。AnonHugePages
,ShmemHugePages
andHugepagesize
: 与系统中大页(通常为2MB或1GB,取决于具体系统)相关的统计信息。这些指标可以提供关于Transparent Huge Pages (THP)使用情况的信息。DirectMap4k
,DirectMap2M
: 以不同页面大小直接映射到系统内存的物理内存量。
以上就是对给出的内存信息参数进行解析的结果。
memory.stat
在 Linux 系统中,/sys/fs/cgroup/memory
目录下的 memory.stat
文件包含了关于内存使用情况的详细信息。以下是对您所列出的各个指标的简单解释:
cache
: 指页缓存(文件系统元数据、目录项、索引节点等)所占用的空间数量。rss
: 代表了进程占用的物理内存大小,不包括 Swap 和文件系统缓存。rss_huge
: 代表了被映射为 “huge pages” 的 RSS 的字节大小。Huge Pages 是一种可以显著提高某些类型内存密集型工作负载性能的内存管理特性。shmem
: 表示共享内存的使用量。mapped_file
: 映射文件的大小(通常包括 tmpfs/shmem 文件以及使用 mmap 进行文件映射的大小)。dirty
: 等待写回磁盘的缓存数据总量。writeback
: 正在被写回到磁盘的数据量。swap
: 被交换出的匿名和文件后备内存的总量。pgpgin
,pgpgout
: 分别表示自系统启动以来的页面读入和写出的次数。pgfault
,pgmajfault
: 分别表示所有的缺页中断次数和产生的大页面故障数。inactive_anon
: 不活跃的匿名页的数量。active_anon
: 活跃的匿名页的数量。inactive_file
: 不活跃的文件页的数量。active_file
: 活跃的文件页的数量。unevictable
: 无法回收的页面数,比如 mlock()锁住的页面。hierarchical_memory_limit
,hierarchical_memsw_limit
: 分别表示分层内存限制和分层交换空间限制。total_*
: 表示包括所有子 cgroup 在内的总量的相关指标。recent_rotated_anon
,recent_rotated_file
: 分别表示最近被旋转的匿名页和文件页的数量。"旋转"意味着页已经从活动列表移到非活动列表,或者反过来。recent_scanned_anon
,recent_scanned_file
: 分别表示最近扫描的匿名页和文件页的数量。
这些数据可以帮助我们评估系统的内存使用情况,以及进行故障排查等任务。
mysqld进程的RSS(Resident Set Size)占用非常大
当在Linux中发现mysqld进程的RSS(Resident Set Size)占用非常大时,可以通过以下步骤进行排查:
-
确认mysqld进程的内存使用情况
首先,可以使用
top
或ps
命令来查看mysqld进程的内存使用情况。例如:top -p $(pgrep -d',' -f mysqld)
或者
ps aux | grep mysqld
-
检查MySQL的配置
在/etc/my.cnf或者其他MySQL的配置文件中,查找是否有对以下变量的设置:
innodb_buffer_pool_size
innodb_additional_mem_pool_size
key_buffer_size
这些参数都会影响MySQL的内存使用。
-
分析MySQL的性能和状态
可以使用
SHOW GLOBAL STATUS;
和SHOW ENGINE INNODB STATUS;
命令来分析MySQL服务器的状态和InnoDB引擎的状态。 -
使用mysqltuner脚本
mysqltuner是一个Perl脚本,它快速审查MySQL的性能,然后给出具体的调优建议。
-
使用Valgrind工具
如果上述方法都无法找到问题,可能需要深入挖掘。在这种情况下,我们可以使用Valgrind等工具来跟踪内存管理。
注意:在排查过程中,确保备份重要数据以防止任何可能的数据丢失。