数据库服务器的性能调优-续
来源:互联网 发布:网络不谢是什么意思 编辑:程序博客网 时间:2024/05/21 21:56
一、进程管理
企业级数据库服务器可能拥有数千个并发访问数据库的用户。某些用户可能执行只需较少处理能力的简单事务,而其他用户则可能执行涉及更多系统资源的复杂事务。 数据库性能常常基于诸如每小时的事务数或 X个并发连接下的最小响应时间等度量来讨论。这些性能约束由企业施加,以便确保客户的质量保证等级。由于对并发处理具有如此高的需求,企业级数据库服务器需要运行于大型 SMP服务器上。早期的 Linux内核并不很适合充当需要高并发度的数据库服务器。这些内核并没有随着系统上的处理器数量的增加而提供良好的扩展性,因为早期内核的开发由单处理器机器所驱动。迁移至多处理器平台时需要许多全局内核锁的支持,否则会导致串行化问题。 其中最大的锁是用于保护单个未排序的运行队列的自旋锁(spin lock)。 在单处理器环境中, 单个队列足以调度所有可运行任务。然而, 在 SMP环境中, 单个运行队列并不够,这会成为一个瓶颈。随着处理器数量的增多,在运行队列上锁竞争的可能性也增加。另
外,由于该队列是未排序的,当锁被持有时调度器需要检查队列中的所有任务以便确定每个任务的良好度(每个任务被赋予一个良好度取值, 用于确定哪个任务将是被调度至处理器上运行的最佳候选)。 这增加了锁持有时间, 从而增加了锁竞争的可能性或加剧当前的竞争条件。在 Linux 2.5内核中, 这个唯一运行队列被删除并替换为基于 CPU的运行队列。拥有多个运行队列删除了对单个全局锁的需求并改进了整体的可扩展性。另外,每个运行队列都维护一个优先级列表,有助于调度器选择要运行的最佳任务。这种优先排序可以减少队列上的锁持有时间,并进一步减少了锁竞争 。
二、内存管理
管理大型企业的数据库需要在大型对称多处理(SymmetricalMultiprocessing,SMP)服务器上运行。这种服务器常常配置了海量物理内存。系统的大部分内存都被分配给数据库缓冲区 cache区域(称为数据库缓冲区)。数据库缓冲区用于缓存从磁盘读至内存中的表和索引数据页。由于磁盘访问相对于内存访问来说是缓慢的操作,将更多内存分配给数据库缓冲区可以极大改进数据库性能。适当调优的数据库会占用大部分可用内存,而为其他正在运行的应用和操作系统只保留够用的内存大小。为数据库分配过多内存会剥夺其他应用可用的内存空间。 另外, 过度分配内存会导致过多的交换, 这对于数据库性能极为有害。
读写实现,则执行串行 I/O的应用会完成以下操作之一:
- 执行数据库页面大小的 I/O操作。
- 执行大型块 I/O操作,并使用 memcpy函数在读/写缓冲区与数据库缓冲区之间复制数据页面。
GNU C Library(GLIBC)异步 I/O接口通过用户级线程来执行阻塞 I/O操作。这种方法只是使得请求对于应用而言看起来是异步的,但与前面描述的方法并无区别,也面临着同样的性能缺陷。为了消除该问题, Linux 2.6 内核中引入了内核异步 I/O(Kernel AsynchronousI/O, KAIO)接口。 KAIO在内核而不是用户空间中以线程方式实现异步 I/O
机制,确保了真正的异步性。
使用文件系统而不是 raw设备作为存储介质的主要吸引力是因为其易于调整数据库存储器的容量。只需添加更多的磁盘就可以增加文件系统的大小。 文件系统的另一个优点是提供了许多可用的工具,例如, DBA可以使用 fsck来帮助维护数据完整性。
将文件系统用作没有直接 I/O接口的存储介质也存在着一些缺点。其中之一就是缓冲区 cache守护进程所增加的开销,该进程会主动地将脏页面清空到磁盘上。这种活动所消耗的 CPU周期对于 CPU密集的数据库工作负荷来说是宝贵资源;另一个缺点与缓冲区cache不命中问题有关。如果数据不经常重用,其开销会很大。
对于大型数据库系统而言,会为数据库缓冲区分配内存。大型的数据库缓冲区降低了数据库应用的磁盘读写频率,也减少了文件系统缓冲区 cache可用的内存量。这会对服务器性能产生双面影响。首先, 缓冲区 cache守护进程更积极地将脏页面清空到磁盘上(页面更快地变脏)。 其次, 对于容量更小的缓冲区 cache, 数据驻留于其中的可能性要
小得多,这增加了缓冲区 cache不命中的可能性 。
充来自物理设备的数据,然后再将这些块接合为原始的读缓冲区。类似地,当来自应用的一个写请求到达时, 设备驱动程序将写缓冲区划分成扇区大小的块,并使用相关缓冲区头部的取值来更新磁盘上的物理数据。在 Lnux2.6内核中,原始 I/O的块大小为 4096B而不是 512B。 这个简单的变化通过减少原始 I/O操作所需的缓冲区头部数量, 改进了整体 I/O吞吐率和 CPU利用率。缓冲区头部更少的话,也可以降低维护其所需的内核开销,而大型块的使用减少了设备驱动程序针对一个 I/O请求需要执行的划分—接合操作数。
最近的内核版本里已从 SCSI子系统中删除了这个全局锁(io_request_lock)。在其位置上,每个 I/O请求队列都由自己的 request_queue_lock锁加以保护。 I/O请求的串行化现象仍会出现,但只发生在单个请求队列上,而不会发生在 SCSI子系统中的所有请求队列上。
- 数据库服务器的性能调优-续
- Linux数据库服务器的性能调优
- 数据库服务器的性能调优
- LAMP系统性能调优 MySQL数据库服务器优化
- LAMP系统性能调优 MySQL数据库服务器优化
- 数据库服务器性能测试
- 应用服务器的综合性能调优
- 服务器性能调优
- 服务器性能调优
- 数据库性能调优
- 数据库驱动的WEB应用程序性能(与服务器无关)
- 教你调整Oracle数据库服务器的性能
- 教你调整Oracle数据库服务器的性能
- 教你调整Oracle数据库服务器的性能
- 教你调整Oracle数据库服务器的性能
- 教你调整Oracle数据库服务器的性能
- 调整Oracle数据库服务器性能的一些参考
- 教你调整Oracle数据库服务器的性能
- 洛谷1313 计算系数
- 关于动态生成的标签无法绑定事件
- Android 5.1-s5p6818平台总结-编译时候出现“intermediates/src/R.stamp] ”的问题
- 谈谈8583报文的使用及测试
- 如何转载CSDN文章
- 数据库服务器的性能调优-续
- Memcached基础入门和Java操作Memcached实现增删改查
- 基本数据类型对象包装类-Integer
- Action接口的使用
- c3p0的基本操作
- 电商总结(一)小型电商网站的架构
- Android Canvas 多张图片拼接成长图
- Leetcode 128 Longest Consecutive Sequence
- MySQL存储包含特殊字符的字符串时为空