Firebird2.5架构-Dmitry Yemanov
Firebird2.5架构
-Dmitry Yemanov(2008年Firebird会议上的报告)
英文连接为:http://www.slideshare.net/ibsurgeon/firebird-25-architecture-by-dmitry-yemanov-in-english
一、该版本出现的原因
1.1 统一Classic/SuperServer模式的第一步
1.2 代码库的现代化(注:进一步从C代码改为C++及代码风格的变动)
1.3 公共的线程基础架构和更高效率的多线程支持
1.4 若干新功能
1.5 V2.1和V3的一个中间版本
二、主要目标--线程化
2.1 清理多线程相关代码为主
2.1.1 仅运行在支持多线程的操作系统平台上
2.1.2 更新老的同步逻辑代码
2.1.3 从API开始(包括Client和embedded),广泛的贯穿整个系统的线程安全
2.2 更好的可伸缩性
2.2.1 不再使用协同调度(注:GC的协同调度模式在V2就开始废弃了)
2.2.2 告别了全局互斥锁
2.2.3 同步放到了更低层次
2.3 服务层/远程服务子系统
2.3.1 工作线程池
2.3.2 异步连接代码的清理
2.3.3 统一SS和CS模式下的服务监听代码
2.4 锁的管理
2.4.1 非阻塞式通知
2.4.2 不再需要设置静态信号量
2.4.3 每数据库单独的锁表
三、对现架构的影响
3.1 Classic Server
3.1.1 锁管理器不再显式地使用信号量和信号
3.1.2 fb_lock_mgr程序在POSIX系统中声明将不再使用
3.1.3 服务和自动清理以线程方式运行(减少创建进程的开销)
3.1.4 服务器层可以立即检测到断开的网络连接并终止对应工作线程的处理过程
3.1.5 libfbembed.so是线程安全的
3.2 SuperServer
3.2.1 数据库引擎内低层次的同步实现带来更好的全面可扩展性和响应时间
3.2.2 当多个数据库被并发访问时,SMP/多核CPU得到有效的使用
3.2.3 fbclient.so/fbclient.dll是线程安全的
3.3 Embedded Server
3.3.1 这个版本基于Classic Server,同时拥有SuperClassic的所有优点
3.3.2 多个进程可以安全地访问数据库
3.3.3 官方工具(gbak,gfix,isql等)同样可以使用
3.3.4 fbembed.dll是线程安全的
四、什么是Super Classic模式
4.1 架构
4.1.1 单进程,多个工作线程(线程池)
4.1.2 每个连接拥有自己的页缓存和元数据缓存
4.1.3 许多进程内的优化
4.1.4 数据库可以安全的被Classic、SuperClassic和Embedded Server所共享访问
4.2 与Classic模式相比有什么好处
4.2.1 更少的内核资源(但不包括内存)的使用
4.2.2 消除了扩展性方面的限制
4.2.3 锁管理的本地调用和进程内优化带来更好的性能(TPC-C测试中性能有25%的提升)
4.2.3 服务库可以作为一个整体被安全停止
4.2.4 列举访问的数据库和用户成为可能
4.2.5 对安全数据库的连接进行缓存
4.3 与SuperServer相比有什么好处
4.3.1 更好的可扩展性(连接数不再有明确的限制)
4.3.2 对于SMP/多核的计算机上有更好的并发性
4.3.3 高负荷下有更好的响应
4.4 缺点
4.4.1 仍然不能充分使用内存
4.4.2 锁表内容使用频繁(页锁),需要小心的调整锁管理器
4.4.3 服务器崩溃会影响所有连接的用户
4.4.4 对32位系统没什么意义
4.5 Windows下的使用
4.5.1 与Classic模式的服务程序一样
4.5.2 应用程序启动方法:fb_inet_server.exe -a -m
4.5.3 服务启动方法:instsvc install -m
4.6 POSIX下的使用
4.6.1 新的fb_smp_server程序
4.6.2 不再需要[x]inetd
五、紧密合作
5.1 Firebird团队
5.1.1 数据库引擎核心内部的同步
5.1.2 SuperClassic和Embedded模式
5.1.3 更新的锁管理器
5.1.4 重写了远程连接管理子系统
5.2 SAS研究所
5.2.1 并发测试,SuperClassic和Embedded模式
5.3 Redsoft公司
5.3.1 并发测试和问题修正
六、Firebird 3.0的演变目标
6.1 架构
6.1.1 单个服务器程序,不同的工作模式:
-共享模式,多个服务进程(象CS)
-专有模式,单独的服务进程(象SS)
6.1.2 每个数据库都可以单独配置
6.2 多线程能力
6.2.1 完全交叉并发访问
6.2.2 预备语句的缓存