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

文档中心 > 聚石塔

应用优化--ECS篇

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

        应用优化  ECS

 

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

 

CPU优化

影响CPU瓶颈的因素:

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

2. 数据库不要安装在ECS上,数据库程序有问题,会导致CPU高,建议将数据库迁移到RDS,数据库优化可以参考性能优化-RDS篇。

3.应用程序的优化也是CPU性能优化核心,如果一个应用程序存在BUG,那么即使所有其他方面都达到了最优状态,整个应用系统还是性能低下,CPU还是飘高,因此对应用程序的优化对性能优化是格外重要

优化CPU的方法:

通过系统命令查看CPU信息

Linux常用命令:PSTOP来查看CPU使用率、进程等等信息,

windows系统使用系统管理器查看CPU使用率、进程等等信息。性能计数器监控一定时间范围内CPU使用率。

CPU使用率高,发生的时间很难控制,编辑脚本将监控数据输出到log文件里。

 

内存优化

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

影响内存瓶颈的因素

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

2. 应用程序优化

如何

改变页面文件的位置

其目的主要是为了保持虚拟内存的连续性。因为硬盘读取数据是靠磁头在磁性物质上读取,页面文件放在磁盘上的不同区域,磁头就要跳来跳去,自然不利于提高效率。而且系统盘文件众多,虚拟内存肯定不连续,因此要将其放到其他盘上。改变页面文件位置的方法是:用鼠标右键点击我的电脑,选择属性高级性能设置高级更改虚拟内存,在驱动器栏里选择想要改变到的位置即可。值得注意的是,当移动好页面文件后,要将原来的文件删除(系统不会自动删除)

改变页面文件的大小

改变了页面文件的位置后,我们还可以对它的大小进行一些调整。调整时我们需要注意,不要将最大、最小页面文件设为等值。因为通常内存不会真正塞满,它会在内存储量达到一定程度时,自动将一部分暂时不用的数据放到硬盘中。最小页面文件越大,所占比例就低,执行的速度也就越慢。最大页面文件是极限值,有时打开很多程序,内存和最小页面文件都已塞满,就会自动溢出到最大页面文件。所以将两者设为等值是不合理的。一般情况下,最小页面文件设得小些,这样能在内存中尽可能存储更多数据,效率就越高。最大页面文件设得大些,以免出现满员的情况。

禁用页面文件

当拥有了512MB以上的内存时,页面文件的作用将不再明显,因此我们可以将其禁用。方法是:依次进入注册表编辑器HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession Ma-nagerMemoryManagement下,在“DisablePa-ging Executive”(禁用页面文件)选项中将其值设为“1”即可。

清空页面文件

在同一位置上有一个ClearPageFileAtShutdown(关机时清除页面文件,将该值设为“1”。这里所说的清除页面文件并非是指从硬盘上完全删除pagefile.sys文件,而是对其进行清洗和整理,从而为下次启动Windows XP时更好地利用虚拟内存做好准备。

调整高速缓存区域的大小

可以在计算机的主要用途选项卡中设置系统利用高速缓存的比例(针对Windows 98)。如果系统的内存较多,可选择网络服务器,这样系统将用较多的内存作为高速缓存。在CD-ROM标签中,可以直接调节系统用多少内存作为CD-ROM光盘读写的高速缓存。

监视内存

系统的内存不管有多大,总是会用完的。虽然有虚拟内存,但由于硬盘的读写速度无法与内存的速度相比,所以在使用内存时,就要时刻监视内存的使用情况。Windows操作系统中提供了一个系统监视器,可以监视内存的使用情况。一般情况下如果只有60%的内存资源可用,这时你就要注意调整内存了,不然就会严重影响电脑的运行速度和系统性能,否则会很卡的。

及时释放内存空间

如果你发现系统的内存不多了,就要注意释放内存。所谓释放内存,就是将驻留在内存中的数据从内存中释放出来。释放内存最简单有效的方法,就是重新启动计算机。另外,就是关闭暂时不用的程序。还有要注意剪贴板中如果存储了图像资料,是要占用大量内存空间的。这时只要剪贴几个字,就可以把内存中剪贴 板上原有的图片冲掉,从而将它所占用的大量的内存释放出来。

优化内存中的数据

Windows中,驻留内存中的数据越多,就越要占用内存资源。所以,桌面上和任务栏中的快捷图标不要设置得太多。如果内存资源较为紧张,可以考虑尽量少用各种后台驻留的程序。平时在操作电脑时,不要打开太多的文件或窗口。长时间地使用计算机后,如果没有重新启动计算机,内存中的数据排列就有可能因为比较混乱,从而导致系统性能的下降。这时你就要考虑重新启动计算机。

 

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

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

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

CPU优化案例:

一个十万火急的CASE,客户抱怨ECS升级后系统会变慢和CPU使用率相当高,客户脾气很大,声称不尽快解决这个问题就退货,排查解决的思路如下:

1.首先用top命令查看哪个进程占用CPU
gateway网关进程13094占用CPU高达891%,这个数值是进程内各个线程占用CPU的累加值。

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
13009 root 15 0 315m 10m 7308 S 891% 2.2 1:49.01 gateway
20642 root 17 0 17784 4138 2220 S 0.5 0.8 2:39.96 microdasys
1679 root 18 0 10984 1856 1556 R 0.3 0.4 0:22.21 sshd
22563 root 18 0 2424 1060 800 R 0.3 0.2 0:00.03 top
1 root 18 0 2156 492 460 S 0.0 0.1 0:01.59 init
2.
top -H -p pid命令查看进程内各个线程占用的CPU百分比
#top -H -p 13009
top
中可以看到有107个线程,但是下面9个线程占用CPU很高,下面以线程13086为主,分析其为何high CPU

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

13086 root 25 0 922m 913m 538m R 101 10.0 21:35.46 gateway

13087 root 25 0 922m 913m 538m R 101 10.0 10:50.22 gateway

13081 root 25 0 922m 913m 538m S 99 10.0 8:57.36 gateway

13082 root 25 0 922m 913m 538m R 99 10.0 11:51.92 gateway

13089 root 25 0 922m 913m 538m R 99 10.0 21:21.77 gateway

13092 root 25 0 922m 913m 538m R 99 10.0 19:55.47 gateway

13094 root 25 0 922m 913m 538m R 99 10.0 21:02.21 gateway

13083 root 25 0 922m 913m 538m R 97 10.0 21:32.39 gateway

13088 root 25 0 922m 913m 538m R 97 10.0 11:23.12 gateway

 

3.使用gstack命令查看进程中各线程的函数调用栈
#gstack 13094 > gstack.log
gstack.log中查找线程ID13086,由于函数栈会暴露函数细节,因此只显示了两个函数桢,线程ID13086对应线程号是37

Thread 37 (Thread 0x4696ab90 (LWP 13086)):
#0 0x40000410 in __kernel_vsyscall ()
#1 0x40241f33 in poll () from /lib/i686/nosegneg/libc.so.6


4.
使用gcore命令转存进程映像及内存上下文

#gcore 13094
该命令生成core文件core.13094


5
。用strace命令查看系统调用和花费的时间
#strace -T -r -c -p 13094

-c
参数显示统计信息,去掉此参数可以查看每个系统调用话费的时间及返回值。

% time seconds usecs/call calls errors syscall

------ ----------- ----------- --------- --------- ----------------------------

99.99 22.683879 3385 6702 poll

0.00 0.001132 0 6702 gettimeofday

0.00 0.000127 1 208 208 accept

0.00 0.000022 22 1 read

0.00 0.000000 0 1 write

0.00 0.000000 0 1 close

0.00 0.000000 0 13 time

0.00 0.000000 0 2 stat64

0.00 0.000000 0 4 clock_gettime

0.00 0.000000 0 7 send

0.00 0.000000 0 10 10 recvfrom

------ ----------- ----------- --------- --------- ------------------------------

100.00 22.685160 13652 218 total


 

6.gdb调试core文件,并线程切换到37号线程
gcore和实际的core dump时产生的core文件几乎一样,只是不能用gdb进行某些动态调试

(gdb) gdb gateway core.13094
(gdb) thread 37
[Switching to thread 37 (Thread 0x4696ab90 (LWP 13086))]#0 0x40000410 in __kernel_vsyscall ()
(gdb) where
#0 0x40000410 in __kernel_vsyscall ()
#1 0x40241f33 in poll () from /lib/i686/nosegneg/libc.so.6


可以根据详细的函数栈进行gdb调试,打印一些变量值,并结合源代码分析为何会poll调用占用很高的CPU
因为代码涉及到客户的数据安全,故不在此做详细分析,需要明白的是分析的流程和使用的命令。

1

 

FAQ

关于此文档暂时还没有FAQ
文档标签:
ECS
返回
顶部