存储+调优:调优二-memory
调优的目的
1。系统是怎么工作的
2。发现系统的问题,怎么去解决
修改软件(开发人员是否能修改软件)
更换硬件
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 1010 981 29 0 145 649
-/+ buffers/cache: 186 824
Swap: 2047 0 2047
[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 48584 118300 663564 0 0 12 23 60 240 3 2 95 0 0
r R状态进程个数
b I/O阻塞进程个数
[root@localhost ~]# dd if=/dev/zero of=/tmp/file1
[root@localhost ~]# vmstat 1 100
bi block读磁盘
bo block写磁盘
执行find /
bi高 bo(atime)
swapd已用swap
读写操作 buffer cache会改变
si:swap换入
so:swap换出
cs:进程上下文切换
cpu执行进程加载进程的数据,执行下一个进程切换下一个进程上下文,进程切换比较频繁
id:30%正常
memory:
内存中存的是什么?
程序需要的环境变量
程序需要的库文件
程序本身
程序临时产生数据需要动态调整内存
程序需要打开的文件
kernel常驻内存
消耗内存最多的是进程
|-------------|
|进程间通信 | 管道符,前一个命令的输出存在那里?
|-------------|
|buffer/cache |
|-------------|
|进程 |
|-------------|
|kernel |
|-------------|
内存使用是否有异常情况发生
[root@localhost ~]# yum install memtest86+
ECC内存,即应用了能够实现错误检查和纠正技术(ECC)的内存条。一般多应用在服务器及图形工作站上,这将使整个电脑系统在工作时更趋于安全稳定。ECC是“Error Checking and Correcting”的简写,中文名称是“错误检查和纠正”。
[root@localhost ~]# memtest-setup
Setup complete.
[root@localhost ~]# hdparm -Tt /dev/sda
/dev/sda:
Timing cached reads: 3896 MB in 2.00 seconds = 1949.43 MB/sec
Timing buffered disk reads: 38 MB in 3.09 seconds = 12.31 MB/sec
内存大小限制
32位操作系统 4G
kernel-PAE 4G X 2*4 = 64G
free -m
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 1010 961 49 0 155 618
-/+ buffers/cache: 188 822
Swap: 2047 0 2047
buffer/cache
文件的内容 data block 1K 4K
文件的属性 inode block 128Byte
find命令可以看到buffer增长
把缓存中的数据,同不到磁盘上
在缓存中的数据称为脏数据
[root@localhost ~]# cat /proc/sys/vm/dirty_
dirty_background_ratio dirty_ratio
dirty_expire_centisecs dirty_writeback_centisecs
[root@localhost ~]# cat /proc/sys/vm/dirty_writeback_centisecs
499
百分之一秒,5秒写一次
vmstat 1 100
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 39264 167824 633128 0 0 7 17 56 221 2 2 96 0 0
观察bo
如果单个进程占用的buffer/cache达到内存总量的40%,立刻同步。
[root@localhost ~]# cat /proc/sys/vm/dirty_ratio
40
所有进程占用的buffer/cache使得剩余内存低于内存总量的10%,立刻同步
[root@localhost ~]# cat /proc/sys/vm/dirty_background_ratio
10
30秒之内数据必须被同步
[root@localhost ~]# cat /proc/sys/vm/dirty_expire_centisecs
2999
kernel级别进程pdflush用来同步脏数据
[root@localhost ~]# ps aux | grep pdflush
root 248 0.0 0.0 0 0 ? S Apr02 0:00 [pdflush]
root 249 0.0 0.0 0 0 ? S Apr02 0:25 [pdflush]
root 12525 0.0 0.0 3920 688 pts/2 R+ 11:03 0:00 grep pdflush
[root@localhost ~]# cat /proc/sys/vm/nr_pdflush_threads
2
手工同步脏数据(卸载U盘)
[root@localhost ~]# sync
内存不够用,会发生什么情况
[root@localhost ~]# ulimit -v 0
[root@localhost ~]# ls
Killed
[root@localhost ~]# cat /proc/meminfo | grep -i active
Active: 575380 kB 内存中经常访问的
Inactive: 362592 kB 内存中不经常访问的
内存不够用的时候可以使用交换分区
交换分区的喜好程度
[root@localhost ~]# cat /proc/sys/vm/swappiness
60
linux在内存还剩余一点的时候,使用交换分区,喜好程度的值越大,越会考虑用swap
在内存不够用的时候,会交换Inactive
非活跃的数据比较多的时候,才会考虑增大交换分区
内存不够用的时候,make编译,增加交换分区也不能解决问题
内存不都用可以考虑释放buffer/cache
[root@localhost ~]# cat /proc/sys/vm/drop_caches
0
1 释放cache
2 释放buffer
3 buffer/cache都释放
===============================================
[root@localhost ~]# man 5 proc 少部分内核参数
[root@localhost ~]# yum install kernel-doc
[root@localhost ~]# grep -r "drop_cache" /usr/share/doc/kernel-doc-2.6.18/[root@localhost ~]# less /usr/share/doc/kernel-doc-2.6.18/Documentation/filesystems/proc.txt
===============================================
把外存当内存来用mkswap
并行swap
swapon -p 5 /dev/sda5
swapon -p 5 /dev/sda6
/etc/fstab
/dev/sda5 swap swap defaults,pri=5 0 0
把内存当磁盘来用(确保磁盘不会断电)对容量空间没有要求,对I/O要求比较高
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 37G 3.1G 32G 9% /
/dev/sda1 99M 12M 83M 13% /boot
tmpfs 506M 0 506M 0% /dev/shm (共享内存)
/dev/hdc 2.9G 2.9G 0 100% /media/RHEL_5.5 i386 DVD
[root@localhost ~]# mount -t tmpfs -o size=100M tmpfs /mnt/
[root@localhost ~]# mount | grep tmp
tmpfs on /dev/shm type tmpfs (rw)
tmpfs on /mnt type tmpfs (rw,size=100M)
[root@localhost ~]# dd if=/dev/zero of=/mnt/file50M bs=1M count=50
50+0 records in
50+0 records out
52428800 bytes (52 MB) copied, 8.46085 seconds, 6.2 MB/s
[root@localhost ~]# dd if=/dev/zero of=/tmp/file50M bs=1M count=50 oflag=direct
50+0 records in
50+0 records out
52428800 bytes (52 MB) copied, 31.2616 seconds, 1.7 MB/s
kernel拿tmpfs给进程用
[root@localhost ~]# grep tmpfs /etc/fstab
tmpfs /dev/shm tmpfs defaults 0 0
内存不够用的时候,会发生什么情况
关闭交换分区,挂载一个超过内存大小的tmpfs,dd内容直到内存耗尽。
内存调优
谁在用内存
进程间通信
buffer/cache
进程
kernel
进程间通信
Unix pipe 本地进程间通信
socket 本地/网络进程间通信,主要是网络
SysV 消息队列
信号量
共享内存段
[root@localhost ~]# ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x740380cb 3080192 root 600 4 0
0x00000000 3473409 root 600 393216 2 dest
0x740380ca 3047426 root 600 4 0
0x00000000 3506179 root 600 393216 2 dest
0x00000000 3538948 root 600 393216 2 dest
0x00000000 3571717 root 600 393216 2 dest
0x00000000 3604486 root 600 393216 2 dest
0x00000000 3637255 root 600 393216 2 dest
0x00000000 3670024 root 600 393216 2 dest
0x00000000 4161545 root 600 393216 2 dest
0x00000000 3735562 root 600 393216 2 dest
0x00000000 3768331 root 600 393216 2 dest
0x00000000 3801100 root 600 393216 2 dest
0x00000000 4194317 root 600 393216 2 dest
0x00000000 4259854 root 600 393216 2 dest
------ Semaphore Arrays --------
key semid owner perms nsems
------ Message Queues --------
key msqid owner perms used-bytes messages
管道不能传输太多的内容,可能发生 pipe broken
pipe < 消息队列 < 共享内存段
信号量数组中可以存放文件的锁标记,有开发人员决定用不用或存什么,没有命令能够看到
[root@localhost ~]# ll /dev/initctl
prw------- 1 root root 0 Mar 30 11:41 /dev/initctl
[root@localhost ~]# ls /proc/sys/kernel/shm*
/proc/sys/kernel/shmall /proc/sys/kernel/shmmax /proc/sys/kernel/shmmni
[root@localhost ~]# ls /proc/sys/kernel/msg*
/proc/sys/kernel/msgmax /proc/sys/kernel/msgmnb /proc/sys/kernel/msgmni
[root@localhost ~]# ls /proc/sys/kernel/sem*
/proc/sys/kernel/sem
[root@localhost ~]# sar -r 1 1
Linux 2.6.18-194.el5 (localhost.localdomain) 04/04/2012
01:01:42 PM kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
01:01:43 PM 591720 443388 42.83 11100 243604 2096472 0 0.00 0
Average: 591720 443388 42.83 11100 243604 2096472 0 0.00 0
===========================================
1、做实验,耗尽内存
如:做一个内存磁盘,往其中dd写大文件,直到内存被占尽。然后出现 kill进程的情况
2、做一个内存磁盘,让apache使用
3、创建一个交换分区
4、linux下进程间通讯的方式有几种? 分别是?
5、解释vmstat命令的输出结果的段含义(man)
===========================================
free命令
1。使用free命令查看内存状态,记录当前内存总量,内存剩余量。
2。执行以下命令,并在执行之后查看当前内存总量,内存剩余量
dd if=/dev/zere of=file bs=1M count=200
3.内存剩余是否有变化?
4。对比命令执行前后的-/+buffer/cache的数据显示,变化是否很大?
5。执行一下命令,并在执行之后查看当前内存状态,对比之前的状态。
echo 1 > /proc/sys/vm/drop_caches
6.通过查询帮助理解/proc/sys/vm/drop_caches文件的作用。