注意:以下文档只适用于TOP接口,请谨慎使用!

文档中心 > 聚石塔

ECS 内存优化方案

更新时间:2015/09/18 访问次数:33931

应用优化--ECS

ECS服务器以最优的状态运行,ECS硬件配置、系统问题、系统架构、网络、软件等问题都会影响到系统的性能好坏,如何定位性能问题出在哪个方面,如何解决性能问题,是ECS性能优化的一大难题。本ECS篇从这些方面,重点讲述优化CPU、内存、IO的性能问题的方法,并且提供ECS典型优化案例。

.内存优化

优化内存的管理,提高内存的使用效率,尽可能地提高运行速度,。下面介绍在Windows \linux中,影响的因素,提高内存的使用效率和优化内存的方法

内存太小,系统进程将被阻塞,应用也将变得缓慢,甚至失去响应;内存太大,导致资源浪费。虚拟内存可以缓解物理内存的不足,但是虚拟内存的过多占用会导致应用程序的性能明显下降。虚拟内存消耗更多,意味着服务器的空闲内存已经不够。

在一个32位处理器的windowslinux系统中超过4GB的物理内存都将被浪费,因此要使用更大的内存,建议选择64位的操作系统,同时开启linux的大内存内核支持。由于处理器寻址范围的限制,在32linux操作系统上,应用程序单个进程最大只能使用2GB的内存。

1.影响内存瓶颈的因素

A.硬件配置低,难以满足应用正常运行所需的内存资源

B. 系统配置

C.应用程序设计不好

2.系统性分析标准和优化原则

好:SwapIn(si) = 0 SwapOut(so) = 0

坏:Per CPU with 10page/s

糟糕:more swap In & swap out

3.监控内存状况

A.通过应用管家监控ECS服务器的内存使用情况:

B.Top-Linux进程监控

Linux下的Top命令是一个性能监控程序,许多系统管理员常常用它来监控Linux性能,在许多Linux或者类Unix操作系统里都有这个命令。Top命令用于按一定的顺序显示所有正在运行而且处于活动状态的实时进程,而且会定期更新显示结果。这条命令显示了CPU的使用率、内存使用率、交换内存使用大小、高速缓存使用大小、缓冲区使用大小,进程PID、所使用命令以及其他。它还可以显示正在运行进程的内存和CPU占用多的情况。对系统管理员来说,top命令式是一个非常有用的,它可用于监控系统并在需要的时候采取正确的处理动作。让我们看看实际中的top命令。

下面看个典型例子

JST#top

top - 19:59:47 up 27 days, 4:55, 6 users, load average: 1.06, 1.04, 1.06

Tasks: 123 total, 2 running, 119 sleeping, 1 stopped, 1 zombie

Cpu(s): 0.1% us, 2.5% sy, 10.2% ni, 87.2% id, 0.0% wa, 0.0% hi, 0.0% si

Mem: 47811272k total, 28204544k used, 19606728k free, 41044k buffers

Swap: 0k total, 0k used, 0k free, 4276844k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

23699 user 35 10 70932 17m 4992 R 99.9 0.0 1842:59 sh

63 root 15 0 0 0 0 S 0.0 0.0 54:00.46 kswapd0

18661 root 16 0 98408 7344 3136 S 0.0 0.0 43:54.33 naming-agent

12944 root 16 0 18020 2844 2016 S 0.0 0.0 4:54.12 executor

24971 root 16 0 241m 184m 3060 S 0.0 0.4 3:54.96 webfoot-agent

1298 root 16 0 5792 844 612 S 0.0 0.0 3:35.97 syslogd

62 root 15 0 0 0 0 S 0.0 0.0 1:42.33 pdflush

61 root 15 0 0 0 0 S 0.0 0.0 1:37.29 pdflush

top输出内存方面的信息,CPUCPU优化部分描述

最后两行输出的是内存信息,

Mem total系统的物理内存大小

used 已经使用的物理内存大小

free 目前空余的内存大小

buffers 用作内核缓冲区的内存大小

Swap total交换分区的内存大小

used 已经使用的交换分区大小

free空闲的交换分区大小

cached 高速缓存的大小

C.VmStat内存统计

LinuxVmStat命令用于显示虚拟内存、内核线程、磁盘、系统进程、I/O 块、中断、CPU 活动 等的统计信息。缺省情况下,vmstat命令在 Linux 系统下不可用,需要安装一个包含了vmstat 程序的sysstat软件包。命令格式的常见用法是:

通常使用vmstat 5 5(表示在5秒时间内进行5次采样)命令测试。将得到一个数据汇总他能够反映真正的系统情况。
JSTvmstat 5 5
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 62792 3460 9116 88092 6 30 189 89 1061 569 17 28 54 2
0 0 62792 3400 9124 88092 0 00 14 884 434 4 14 81 0
0 0 62792 3400 9132 88092 0 00 14 877 424 4 15 81 0
1 0 62792 3400 9140 88092 0 00 14 868 418 6 20 74 0
1 0 62792 3400 9148 88092 0 00 15 847 400 9 25 67 0

4.优化内存的方法

A.Windows中,驻留内存中的数据越多,就越要占用内存资源。一般考虑重新启动计算机。

B.Windows直接使用任务管理器查看,也可使用性能管理器添加内存计数器来动态监控。

一般方法查看到高内存的进程,判断是否是应用程序需要优化或出现死循环,结束相关僵尸进程。

改变页面文件的位置,更改虚拟内存,其目的主要是为了保持虚拟内存的连续性。

改变页面文件的大小

改变了页面文件的位置后,调整最大、最小页面文件,不要将设为等值

及时释放内存空间

如果你发现系统的内存不多了,就要注意释放内存。释放内存最简单有效的方法,就是重新启动计算机。另外,就是关闭暂时不用的程序。特别是sleep、僵尸进程,从而将它所占用的大量的内存释放出来。

C.linux,可以通过dmidecode | grep -A16 “Memory Device$”命令来查看机器插了多少根内存条,以及每根内存条的具体型号,内存条的具体型号,对应用的运行性能也会有些影响,但一般来说不会有CPU那么明显,如java应用

linux要查看机器上内存的使用状况,可通过free -m来查看, free+buffers+cachedos为了提升运行性能,会利用一些内存来做cache,以提升诸如读写文件的速度等。

D.一般方法查看到高内存的进程,判断是否是应用程序需要优化或出现死循环,结束相关sleep和僵尸进程,释放内存。

E.编辑脚本将监控数据输出到log文件里。案例脚本见文档最后附件脚本

F.Linux内核的shmallshmmax参数优化

SHMMAX= 配置了最大的内存segment的大小 ------>这个设置的比SGA_MAX_SIZE大比较好。
SHMMIN= 最小的内存segment的大小
SHMMNI= 整个系统的内存segment的总个数
SHMSEG= 每个进程可以使用的内存segment的最大个数
配置信号灯( semphore )的参数:
SEMMSL= 每个semphore set里面的semphore数量 -----> 这个设置大于你的process的个数吧,否则你不得不分多个semphore set,好像有process+n之说,我忘了n是几了。
SEMMNI= 整个系统的semphore set总数
SEMMNS=整个系统的semphore总数

shmall 是全部允许使用的共享内存大小,shmmax 是单个段允许使用的大小。这两个可以设置为内存的 90%。例如 16G 内存,16*1024*1024*1024*90% = 15461882265shmall 的大小为 15461882265/4k(getconf PAGESIZE可得到) = 3774873

修改 /etc/sysctl.conf

kernel.shmmax=15461882265

kernel.shmall=3774873

kernel.msgmax=65535

kernel.msgmnb=65535

执行 sudo sysctl -p

可以使用 ipcs -l 看结果。ipcs -u 可以看到实际使用的情况

附加性能参数的监控脚本:

linux下监控memo性能数据的脚本,仅供参考

直接贴脚本:
 memo

#!/bin/bash
CurrentDate=`date -d today '+%Y%m%d'`
CurrentTime=`date -d today '+%Y%m%d%H%M'`
mytext="$CurrentTime\t`top -b -n 1 | grep Mem:`"
echo -e $mytext >> /home/www/monitor/log/memo$CurrentDate.log

 

 

FAQ

关于此文档暂时还没有FAQ
返回
顶部