OneSQL :: 开始为PostgreSQL增加限流功能,可以避免复杂SQL语句的干扰!

OneSQL定制的多队列线程池功能非常实用,可以对数据库的读写操作进行资源隔离,也可以对简单的SQL语句和复杂的SQL语句(可以从语法树上进行分析)进行资源隔离,以保证数据库的健康运行。考虑到业务应用开发中,核心应用都是经过深层优化的,而新上的业务却很难有核心业务这么高的代码质量,因此OneSQL的多队列隔离机制,可以让数据库更适合应用,降低对应用开发的要求。

考虑到不同类型操作的资源隔离可能是所有数据库公共的需求,我们也很想将这个机制引入到诸如Oracle、SQL Server、DB2等数据库上,以使之更适应复杂的非互联网行业应用。这些商业数据库平民软件没有办法定制,只能通过研发OneProxy中间件(正在研发了基于Oracle和SQL Server协议的中间件,已经测试版本可提供)来让应用更适应数据库。而另一个开源的数据库PostgreSQL,也引起了平民软件的极大关注,决定将OneSQL上好的机制也引入到PostgreSQL中。第一步就是引入限流功能代码,经过漫长的代码熟悉过程,终于到了开花结果的时修了。

软件下载页面已经可以下载到定制过的版本,请大家尽情测试。下面是我们的一个测试,在定制版本中设置了一个查询语句的最大并行度参数,如下所示:

onesql_query_concurrency=28
onesql_autocommit_concurrency=28
onesql_transaction_concurrency=64
onesql_cpu_offset=2

允许最大的查询并发度为28,这里其实是非事务模式的最大并行度,事务模式的最大并行度为64。下图是使用pgbench测试不同连接数的qps结果,可以看到随着连接数的上升,表现相当平稳,压测过程中的机机负载也相当平稳。

onepgsql_thread_pool_test1

在第一版本中,主要新增了六个参数,分别是:

  1. onesql_query_concurrency:用于指定非事务块(不在BEGIN/END中)中查询语句的并发度,默认值为0,即不执行补丁代码。
  2. onesql_autocommit_concurrency:用于指定非事务块(不在BEGIN/END中)中DML语句的并发度,默认值为0,即不执行补丁代码。
  3. onesql_transaction_concurrency:用于指定事务块的并发度,默认值为0,即不执行补丁代码。如果设为0,而前面两个选项不为0,则事务块中的语句仍然受到各自的并发度控制。
  4. onesql_control_timeout:处于锁等待达到指定时间后,将空出连接池位置给其他进程,以增加锁冲突时的总体并发性能,默认值为100ms,可指定的范置从30ms到3000ms。
  5. onesql_cpu_offset:用于指定CPU绑定的起始值,默认值为1,即第一个Core上不会执行PostgreSQL的代码,我们认为留下一两个Core给软硬件中断和系统调用会更好(测试例子)。
  6. onesql_cpu_count:指定可用于PostgreSQL的CPU核数,在多实例混合布署时,可以通过这个参数和前一个参数来进行隔离布署,以减少相互干扰的情况。

下一步将继结研究PostgreSQL代码,将max_query_concurrency的并发度控制进行进一步的拆分,比如可以分别对复杂查询、简单查询、Insert、Update、Delete等语句进行并发控制(已实现)。在绝大多数应用中,不同的接口的操作是不一样的,通过平民软件定制的PostgreSQL版本,将允许你通过参数精心调配不同业务接口所能使用的数据库资源。