一、sybase ASE 内存结构
SQL Server 启动时按以下顺序预分配内存:
- SQLServer可执行代码
- SQL Server 使 用 的静态内存
- 数据缓存
- 过程缓存
其中,
SQL Server可执行代码所占内存的大小 SQL Server 可执行代码的大小因平台和版本的不同而异,但一般在3M至4M之 间。用dbcc memusage显示 executable code size 参数的值来确定。
静态内存 的大小,这部分内存不受用户配置参数的影响,一般在2.2MB至3.25之间。
用户配置参数占用的内 存,可调用不带参数的sp_configure来显示所有参数和每个 参数使 用 的内存值。
二.内存参数调整
ASE参数中,我们需要关注的和内存相关的参数包括:
- allocate max shared memory (指定是否分配由max memory指定的最大内存,缺省不分配最大内存)
- max memory (确定Sybase最大可用内存)
- total logical memory (当前配置的逻辑内存,只读)
- total physical memory(当前配置的物理内存,只读)
- additional network memory(为要求包大于服务器缺省包大小的客户分配额外的网络内存,合理增加此参数,对于传送大量数据的应用程序,有助于提高性能)
- heap memory per user(SYBASE推荐,此参数大小为逻辑页大小的3倍)
- memory per worker process(设置工作进程使用的内存量【非数据,进程自身消息发布需要的内存量】,缺省的1024基本够用,建议设置为2048)
- global cache partition number(多引擎服务器中, 对缓存分区可以减少单个缓存中的螺旋锁任务争用,提高性能)
- user log cache size(每个用户的日志缓存大小)
因此,需要做如下调整:
sp_configure "max memory",xxx
其中xxx为页数,不论逻辑页设置的是8K还是2K或者16K一律按照 字节数/2048来计算 ;例如,希望设置的max memory为896M,则此值应该为: 896×1024×1024/2048 = 458752
此值的大小为全部内存使用量;因此应该尽可能的大一些,但是不能超过最大共享内存值。该值等于/etc/system文件里定义的shmsys:shminfo_shmmax值/2048
(16G物理内存时,设为6815744)
sp_configure "allocate max shared memory",0
allocate max shared memory 应该保持缺省值0,以避免浪费内存。当此值为1的时候,SYBASE将占用MAX MEMORY设置的内存量,不论是不是实际使用了这些内存;因此,建议设置成0,当需要的时候才申请内存。
sp_configure "additional network memory",524288
此值基本上满足了绝大多数通讯所需的内存缓冲。具体数值需要通过SYSMON观测,才能给出更准确的值。
sp_configure "heap memory per user",49152
当页为16K的时候设置为此值【如果为8K设置成24576;2K时候设置为6144】
sp_configure "memory per worker process",2048
sp_configure "global cache partition number",4
sp_configure "user log cache size",16384
参数在页大小超过2K的情况下,保持与页大小一致;例如:8K页的时候,设置成8192;16K页时,设为16384;当页大小为2K的时候,设置成4096
重启数据库
三、Log Cache
可以将数据库日志绑定到日志缓存上,提高日志的读写性能;经过测试,添加日志缓存后,性能相对没有日志缓存的情况,提高至少30%;经验上,日志缓存至少128M以上;内存允许的情况下,建议设置256M;
具体方法如下:
1. 创建一个命名cache,假如是Hannibal数据库,则
sp_cacheconfig 'Hannibal_log_cache','256M',logonly
--注意logonly参数;
2. 重启数据库,使CACHE生效;
3. 创建8K池,为提高logiosize做准备;(当逻辑页大小为8K的时候不需要再创建了,此时可以建一个16K的池)
sp_poolconfig 'Hannibal_log_cache','250M','8K'
尽可能将Hannibal_log_cache的容量都分配给这个POOL池。如果数据页已经是8K,则不需再创建8K的池了。同理,如果数据页已经是16K,则不需再创建16K的池了。
4. 进入数据库单用户模式,绑定日志到log cache
USE master
go
EXEC sp_dboption 'Hannibal','single user',true
go
use Hannibal
go
checkpoint
go
EXEC sp_bindcache 'Hannibal_log_cache','ipnet','dbo.syslogs'
go
5. 设置logiosize (仍然在单用户模式下),逻辑页为8K或8K以上的不需要做。注意,Hannibal_log_cache里必须有一个和logiosize相同大小的pool;否则出错.
use Hannibal
go
sp_logiosize "8K"
go
6. 恢复数据库OPEN状态
USE master
go
EXEC sp_dboption 'Hannibal','single user',false
go
7. 重启数据库, 之后可以用下列命令核查。
sp_helpcache
sp_poolconfig "Hannibal_log_cache"
sp_logiosize
四. Data Cache
default data cache ――缺省数据缓存,在缺省状态下它的大小是8M,因此我们需要加大此缓存,提高查询的性能。其大小应该尽可能大,以适应大查询的需求。
修改方法:
sp_cacheconfig 'default data cache','5120M'
sp_cacheconfig 'default data cache','cache_partition=8'
重启数据库,使设置生效。
当逻辑页小于8K的时候,需要创建一个8K的pool,以启用大IO;这个POOL的size建议是default data cache的40-60%;
sp_poolconfig "default data cache","2560M","8K"
注意:一个cache必须有一个和逻辑页相同尺寸的pool(缺省状态下的);此外,仅仅需要创建一个比逻辑页尺寸大的pool;例如:逻辑页为2K的时候,仅仅需要创建1个8k的pool就可以了,没有必要同时保留4k/8k/16k。
绝大多数情况下,2倍于逻辑页大小的pool效率最高。因此,对于pool,一般需要2个pool,一个是和逻辑页相同尺寸的pool;另一个是两倍于逻辑页尺寸的pool。
另外,default data cache上没有必要绑定任何数据库对象。
五. Tempdb Cache
创建一个tempdb独享的cache,提高tempdb的性能。经验上,256M就足够用了。
sp_cacheconfig 'tempdb_cache','256M'
重启数据库使设置生效。
将tempdb数据库绑定到此cache上。(注意,命名cache不绑定对象的时候,是没有用的)
use master
go
sp_bindcache "tempdb_cache",tempdb
go
至此,Sybase Cache的配置算告一段落。
出处:http://jackrui.blog.163.com/blog/#m=0&t=3&c=sybase