把数据库该干的活交给OS可行吗
2022-02-10权露
权露
这两天在思考一个问题,现在的OS越来越强大了,能不能把一些数据库该干的事情交给OS去做,这样数据库的内核可以大大简化。这个观点让我想起了10多年前Linux是否需要提供o_direct这个文件IO选项给开发者的讨论。当时Linus Torvalds说了那句十分著名的话—“In short,the whole‘lets bypass the OSnotion is just fundamentally broken. It sounds simple,but it sounds simple only to an idiot who writes databases and doesnt even UNDERSTAND what an OS is meant to do”。他甚至认为绕过OS强大的VMM设计去处理IO是傻瓜才会干的事情,因为Linux已经为数据库类的应用提供了强大的能力。
实际上早期的数据库也是十分依赖于操作系统的,本人使用过的第一个数据库RMS就是一个基于openVMS的记录管理系统,其底层依赖于操作系统的基础IPC能力构建。后来随着数据库变得越来越复杂,需要支持的底层OS平台越来越多,数据库产品逐渐把一些以前OS干的事情由自己独立来干。2012年的一次测试,让我对数据库与OS融合后的能力有了深刻的体会。当时在一台Oracle公司的T4-8上,服务器+Solaris操作系统+Oracle 11g的组合跑出了惊人的高性能。不用做复杂的调优,仅仅装好数据库,简单调整一下数据库参数,就取得了那次测试最佳的成绩。后来和参加测试的其他人聊了聊,他说在这个组合里,Oracle的一些并发控制相关底层调用得到了全面优化,操作系统帮助Oracle的闩锁与锁操作的并发能力得到了极大地提升。
实际上开头提的问题应该不是问题了,现在的Linux与90年代刚刚进入我们视野的时候已经不可同日而语了,那时候的Linux可以很好地支撑Web应用,但是对数据库的底层支持还比较弱。而现在Linux的能力已经得到了巨大的强化,无论是Redis,MongoDB还是ClickHose,这些新生代的数据库产品无一例外的充分利用了操作系统底层的能力,从而简化了很多传统数据库自己要做的复杂控制。外加在存储引擎上使用了大量的开源技术,使得数据库研发的门槛大大降低了。包括我们耳熟能详的开源数据库MySQL,Postgresql,它们在存储引擎上也充分利用了操作系统的能力。充分利用OS FILE CACHE的能力来缓冲数据,从而提升IO性能,通过使用带日志的文件系统来消除数据库double write的开销,这一切都是数据库向OS能力借力的有效例证。
不过通用关系型数据库面临的场景十分复杂,在某些特殊的高负载场景下,OS的自动优化能力还是无法满足数据库的需求。2007年引发的关于o_direct的讨论就是一个十分典型的例证,当时数据库厂商需要自己来控制IO,而不是使用OS提供的能力。
在一个DBA的眼里,Linus的言论似乎是有些武断了,针对复杂的通用关系型数据库来说,数据库自己管理自己的缓冲,在有些时候比完全依赖于OS提供的文件缓冲能力,要高效的多。数据库有自己的一些更为复杂的判断热数据的方法,因此在shared buffer中合适AGEOUT页面,清理哪些页面,数据库管理系统可能更清楚。
不过对于大多数业务应用来说,OS提供的FILE CACHE已经能够很好地帮助我们提升性能了。在目前的Postgresql的官方文档中,还是建议shared buffer只使用20 % ~30 %,剩下的内存交给OS。有些PG用户认为这个建议十分好,他们的数据库按照这个建议设置后性能十分稳定。不过也有些用户认为把物理内存尽可能交给shared buffer会具有更好的性能。这是因为业务应用场景的复杂性,导致2种策略可能在某些场景下会出现相反的效果。
对于一个数据库应用系统来说,其优化是从上到下的。对于一个复杂的应用系统来说,越往上的优化器效果就越好,只不过越往上的优化对于前期建设队伍的能力要求也越高,前期的投入也越大。對于一些较小的,不太复杂的应用系统来说,只需要从下层做好优化就可以了,其实施成本也很低,而负载越高,越复杂的系统就越需要更上层的优化。对于有些系统来说,仅仅依赖操作系统提供的优化能力就不足够了。就像是开手动挡的车和自动挡的车,在一般路况下,自动挡车就足够用了,但是在一些特殊的户外陡坡上,手动挡车可能更胜任,自动挡车完全不胜任。因为自动化的处理能力还是有限的。
不过随着操作系统的不断发展,其能力也越来越强,操作系统对数据库的支撑能力也在不断增强。有些以前需要依靠数据库核心代码去优化的工作依然可以由操作系统来承担。一些专用场景的数据库产品会首先从中受益,有时候数据库不用做升级,升级一下OS,数据库性能自然就提升了。针对某种数据库去定制与优化操作系统也是一种思路,在一些云原生的数据库或者公有云RDS上,可能更容易实现。