我在事务模式下使用pgbouncer并尝试允许接近500个活动事务.目的只是对设置进行压力测试
当前设置:['n'客户--- --- 1 pgbouncer ----> 1 postgres]
我注意到当我使用pgbouncer而不是直接连接到postgres时,我的事务/秒(tps)显着减少.
对于同一套交易(通过pgbench)
直接连接=> 10k(tps)appx
pgbouncer connection => 3k(tps)appx
pgbouncer中是否有任何配置需要调整才能获得更好的性能?
我知道pgbouncer是一个单线程应用程序,但是想把它调整到最好.以下是我的pgbouncer配置:
pgbouncer.ini
pool_mode = transaction
server_reset_query =
# Time outs
server_lifetime=6000
server_idle_timeout=0
server_connect_timeout=30
#pool configuration
max_client_conn=10000
default_pool_size=500
pool_size=500
##other
pkt_buf=4096
server_login_retry=2
Run Code Online (Sandbox Code Playgroud)
我能看到的唯一应用是使用多个pgbouncers指向同一个数据库服务器.
UPDATE
在执行测试时:
cpu利用率:30%appx
磁盘利用率:40%appx
观察:许多交易处于"闲置"状态
测试细节:
10个机器充当客户端向DB服务器运行pgbench触发请求.
命令:pgbench -h -p 6541 -c 512 -j 16 -f pgbench_SchemaScript.sql -T 360 -U postgres test
pgbench_SchemaScript.sql
\setrandom delta 0 100000
insert into t1.emplog values(nextval('t1.employeeSeq'),:delta);
Run Code Online (Sandbox Code Playgroud)
安装了pgbouncer的1个DB服务器(16核,24 Gb RAM)
我试图使用多个线程在Java中编写一个巨大的文件.
我在Java中尝试了两个FileWriter和bufferedWriter类.
正在写入的内容实际上是使用CopyManager和写入的整个表(Postgres).文件中的每一行都是表格中的一个元组,我一次写入100行.
写作方法:
在追加模式下,多个线程打开单个待写文件.之后每个线程都尝试写入文件文件.
以下是我面临的问题:
Filewriter,我会在文件中看到一条黑线.有什么建议,如何避免这种数据完整性问题?
我目前正在增强一个使用spring和hibernate的应用程序.有多个实例,应用程序通过预准备语句与db(postgres)进行通信.应用程序到现在为止,通过dbcp与postgres通信.
更改:应用程序现在通过pgbouncer传达给postgres.
即:应用程序 - > dbcp - > pgbouncer - > postgres
我知道这不是最理想的解决方案,即:有两个普通人.但由于目前的架构,我们需要它们.
要求:pgbouncer不支持事务模式中的预准备语句,因此必须将其删除.
更改以消除准备好的声明.
1)psql:VERSION = 9.2.6
没变
2)pgbouncer:在配置文件中设置以下属性
ignore_startup_parameters=extra_float_digits
pool_mode=transaction
server_reset_query=
Run Code Online (Sandbox Code Playgroud)
3)jdbc:已相应地设置准备的阈值.即:jdbc:postgresql://localhost:6541/postgres?prepareThreshold=0
JAVA VERSION = 1.7.0_51
JDBC DRIVER = postgresql-9.3-1102.jdbc41-3.jar
Run Code Online (Sandbox Code Playgroud)
4)dbcp:poolPreparedStatements = false maxOpenPreparedStatements = 0
5)休眠:没有变化
6)春天:没有变化
问题:
尽管所有这些变化,我仍然看到准备好的陈述试图创建和交易失败的原因.
"错误:预处理语句"S_21"不存在;嵌套异常是org.postgresql.util.PSQLException:错误:预处理语句"S_21"不存在"
我删除了使用预准备语句的所有逻辑更改.
如何防止创建其他预准备语句?spring或hibernate是否在内部为其使用创建了准备好的语句?如果是,我该如何禁用它们?