Linux内存盘提升系统性能手记

标签: linux 内存 提升 | 发表时间:2016-03-28 23:14 | 作者:FeiXing2008
出处:http://www.iteye.com

公司已经有一套运行多年的信息系统。已经积累了三年左右的数据。

数据库使用oracle。系统开发由于赶进度,开发时使用了堆字段,各种关联的方式来设计。
经常出现了5百行以上的SQL语句,经常系统性能不佳,用户报怨系统卡与慢。
经过分析,有多个SQL语句经常超过20秒钟,并且一些批量的操作,会让oracle假死。
由此不得不重启数据库,以便恢复系统正常。
 
细化分析后,发现直接堆代码的地方实在太多,基本业务逻辑都放在数据库中操作。
很多复杂的业务逻辑基本放在数据库当中操作。
程序则反而比较简单,大量的业务都是放在sql语句中去实现。
这里表现的性能瓶颈很明显,基本90%的时间都是在数据库中,而web系统的资源基本都是空闲的。
因于类似的代码超过上万行,一一修改的可能性比较多,修改后会引起各种新的缺陷。
因此通过修改代码来得升性能的可能性很低。
 
分析出来的一些性能较差的结论:
1)业务逻辑大量写在SQL语句,压力集中在数据库;
2)业务逻辑复杂,代码之间关联比较多,代码难以修改优化;
3)基本没有使用索引,查询效率极差;
4)日志数据写在数据库中;
5)查询输出的字段多,每个查询平均输出超过50个字段;
6)关键表的字段超出400个,已经无法再维护表结构;
7)使用oracle数据库,维护操作空间较少;
特征:
8)总数据量并非很大,整个数据库(三年数据,包括所有请求日志)不超50G
 
解决思路:
1.改代码
方法:将性能比较差的请求找出来,然后将sql语句分离,一些业务相关逻辑放在程序当中去处理。
数据库仅做简单的查询与插入,修改操作。
问题:开发成本比较高,需要修改比较多的代码,修改时间比较度,经常引起其他缺陷。
优化的情况不明显,输出的字段还是比较多。
结论:花时间太长。
 
2.做集群
做集群技术能力不足,资料比较少。
需要请oracle相关的人过来。
结论:提升的效果不明显,或者说基本没有效果。
 
 
3.堆硬件
数据库服务器加大内存;
将磁盘换成SSD,做RAID 10;
结论:测试后性能提升很大,许多消耗40秒左右的变成10秒钟左右。
 
4.堆硬件+软件处理
由于增加硬件后,性能提升非常有效,因此往这个方面走得更进一步。
发现内存增加对性能的提升基本推近于零。
磁盘的改进,特别将SSD换上去后,性能才有明显的提升。
因此,需要有比SSD更强大的东西来替代。此时,我直接是想到了内存。
现在内存比较便宜,我想到组建一个内存盘。
通过将内存虚拟成磁盘,一般称为RamDisk,然后将数据库数据放入RamDisk。
此时一般会担心有数据安全的问题,这个问题是有解决方案的,可以稍后讨论。
结论:估计性能会有质的提升,需要解决数据安全问题。
关键不需要修改任何原来业务的逻辑代码。决定走这一步。
 
测试阶段1:
测试目标:将数据库的表空间文件放入RamDisk,查询复杂的语句,取得与常规的SSD相关性能差异量。
准备流程:
1.建立一个32G的RamDisk磁盘。
2.将oracle安装到RamDisk中。
3.建立表空间文件,将文件位置放入RamDisk中。
4.导入生产环境数据库,将此数据库命名为ramDb。
5.找出系统查询最慢的SQL语句,将此业务名为slowJob1,仅查询。
 
执行SQL流程:
在生产环境数据库执行slowJob1语句,输出20w左右的数据,用时40s。
在RamDB数据库执行此语句,输了内容相同,则用时1s。
 
简单结论:
起码使用RamDisk的方式可以有效提高查询效率。查询结果无异。
 
思考:
由于内存的读写效率与磁盘的读写效率差异有10倍之大,基本可以忽略了数据读取性能的相关问题。
理应多复杂的查询,多复杂的数据读取,都基本不需要考虑磁盘性能带来的影响。
目前唯一需要考虑更多的就是数据容量与安全问题。
 
数据容量问题:
由于三年的数据都不超过50G,然而50G中有20G的日志数据,也就是业务数据30g。
以6年的设计,则数据量则约为30*2=60G,也就将RamDisk设计到64G就可以应付6年的数据量。
128G的空间则可以支撑10年。
 
数据安全的思考:
由于内存存在断电数据丢失风险,则需要将数据存入可靠的磁盘中。
读写分离是一个较好的解决方案。
写入数据时,则写入内存块与磁盘块。读时仅读内存块。
此逻辑下,有几种模式:
1)安全型:安全写入磁盘后,完成操作。
2)性能型:写入内存后则返回,异步写入磁盘。
 
第一种写入性能较慢,第二种则快,不过有数据丢失的风险。
两种可以视情况而决定,没有统一的解决方案。
 
当前项目中,写操作次数远远小于读取,而写入内容并不高,在使用SSD+Raid10下,性能已经够和。
则会选择安全型。
 
方案的实现:
一,简易快速方案
服务器64G内存,SSD250G raid 10;
使用windows 2008;
使用魔方内存盘,设定54g内存;
虚拟内存设置在ramdisk上;
安装oracle, oracle data文件夹设置在ramdisk上;
建库,将表空间设置在ramdisk上;
 
风险:软件不够稳定,魔方稳定性比较差,1个月基本会挂一次。
数据不够安全,需要手功去将内存数据存入磁盘中。
 
二,基于linux模块实现
服务器64G内存,SSD250G raid 10;
安装centos 6.5;
安装RamDisk模块(需要开发,另行编写文章介绍);
RamDisk空间设置大小为54G;
配置RamDisk中的映射文件于/home/oracle/ram.img,写同步模式;
安装RamDisk模块后会出现/dev/ramdisk设备
mkfs.ext4 /dev/ramdisk
mkdir /home/oracle/ramdisk
mount /dev/ramdisk /home/oracle/ramdisk 
安装oracle, oracle data文件夹设置在ramdisk上;
建库,将表空间设置在ramdisk上;
RamDisk模块要监测ramdisk所有写入操作,将数据同步到/home/oracle/ram.img
重启系统时,会自动将/home/oracle/ram.img同步入/dev/ramdisk中;
 
好处:数据安全,读取数据性能提升明显。
风险:维护操作相对复杂,需要开发RamDisk模块。

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [linux 内存 提升] 推荐:

Linux内存盘提升系统性能手记

- - 企业架构 - ITeye博客
公司已经有一套运行多年的信息系统. 系统开发由于赶进度,开发时使用了堆字段,各种关联的方式来设计. 经常出现了5百行以上的SQL语句,经常系统性能不佳,用户报怨系统卡与慢. 经过分析,有多个SQL语句经常超过20秒钟,并且一些批量的操作,会让oracle假死. 由此不得不重启数据库,以便恢复系统正常.

e4rat:大幅提升Linux开机速度

- Druggo - LinuxGem
警告:此软件仅限原生ext4文件系统使用. 其他文件系统以及从低版本升级的ext4文件系统用户不要使用,否则将导致灾难性后果.   本着负责的态度,先Warning. 其原理大致是(我猜的):通过磁盘整理有序化开机要加载的文件,并在系统启动阶段把数据预读到内存,充分使用内存和IO资源. snack 发表于 Mon, 20 Jun 2011 23:03:28 +0000.

Linux虚拟内存实现原理

- Sepher - NoSQLFan
下面是一篇翻译文章,原文出自MongoDB的核心开发工程师 Kristina Chodorow 的个人博客,由NoSQLFan翻译整理. 我们都知道,MongoDB 使用内存映射的方式来进行数据文件的存取操作. 本文的目的就在于描述操作系统虚拟内存的使用及内存映射的内部实现. 当你运行一个程序,程序中有许多东西需要存储,堆、栈以及各种功能库.

Linux Used内存到底哪里去了?

- - 非业余研究
原创文章,转载请注明: 转载自 非业余研究. Linux Used内存到底哪里去了. 前几天 纯上 同学问了一个问题:. 我ps aux看到的RSS内存只有不到30M,但是free看到内存却已经使用了7,8G了,已经开始swap了,请问ps aux的实际物理内存统计是不是漏了哪些内存没算. 我有什么办法确定free中used的内存都去哪儿了呢.

Linux系统查看内存使用率

- - BlogJava-qileilove
Linux下看内存和CPU使用率一般都用top命令,但是实际在用的时候,用top查看出来的内存占用率都非常高,如:.   top –M看更直观,以M为单位.   接近98.7%,而实际上的应用程序占用的内存往往并没这么多,.   看%MEM这列的数字,按内存排序后,把前几名加起来,撑死了才不过55%,那剩下的内存都干嘛用了.

Linux与JVM的内存关系分析

- - 美团技术团队
在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux自身使用大约800m. 从表面上,物理内存应该是足够使用的;但实际运行的情况是,会发生大量使用SWAP(说明物理内存不够使用了),如下图所示. 同时,由于SWAP和GC同时发生会致使JVM严重卡顿,所以我们要追问:内存究竟去哪儿了.

提升 Linux 网络性能,应付 100 GB的网卡

- - 极客521 | 极客521
贾斯玻.布鲁勒在2015年澳大利亚Linux研讨会(LCA)的有关内核的小型研讨会上提到:100GB的网卡即将来临( 见幻灯片,PDF格式的). 对Linux内核来说,要以最大的速度驱动这样的适配器将是巨大的挑战. 应对这一挑战是目前和未来一段时间内工作的重心. 好消息是Linux网络通信速度已经有了很大的提高-不过还有一些问题有待解决.

(总结)关于Linux的缓存内存 Cache Memory详解

- d0ngd0ng - 服务器运维与网站架构|Linux运维|互联网研究
前天有朋友问我,为啥我的Linux系统没运行多少程序,显示的可用内存这么少. 其实Linux与Win的内存管理不同,会尽量缓存内存以提高读写性能,通常叫做Cache Memory. 有时候你会发现没有什么程序在运行,但是使用top或free命令看到可用内存free项会很少,此时查看系统的 /proc/meminfo 文件,会发现有一项 Cached Memory:.

Nginx使用Linux内存加速静态文件访问

- - IT技术博客大学习
标签:   Nginx. Nginx是一个非常出色的静态资源web服务器. 如果你嫌它还不够快,可以把放在磁盘中的文件,映射到内存中,减少高并发下的磁盘IO. nginx.conf中所配置站点的路径是/home/wwwroot/res,站点所对应文件原始存储路径:/opt/web/res. shell脚本非常简单,思路就是拷贝资源文件到内存中,然后在把网站的静态文件链接指向到内存中即可.

[转][转]LINUX共享内存使用常见陷阱与分析

- - heiyeluren的blog(黑夜路人的开源世界)
来源: http://www.dcshi.com/?p=79. 所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式. 是针对其他通信机制运行效率较低而设计的. 往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥. 其他进程能把同一段共享内存段“连接到”他们自己的地址空间里去.