PostgreSQL 11 相似图像搜索插件 imgsmlr 性能测试与优化 3 - citus 8机128shard (4亿图像)

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 标签PostgreSQL , imgsmlr , GiST , 图像特征值 , 小波转换 , citus背景续《PostgreSQL 11 相似图像搜索插件 imgsmlr 性能测试 1 - 单机单表 (4亿图像)》《PostgreSQL 11 相似图像搜索插件 imgsmlr 性能...

标签

PostgreSQL , imgsmlr , GiST , 图像特征值 , 小波转换 , citus


背景

《PostgreSQL 11 相似图像搜索插件 imgsmlr 性能测试 1 - 单机单表 (4亿图像)》

《PostgreSQL 11 相似图像搜索插件 imgsmlr 性能测试 2 - 单机分区表 (dblink 异步调用并行) (4亿图像)》

《PostgreSQL sharding : citus 系列1 - 多机部署(含OLTP(TPC-B)测试)》

citus (8节点, 128 shard)

1、安装imgsmlr插件软件 (所有节点)

2、create extension imgsmlr (所有节点)

3、生成随机img sig的函数 (cn, 因为只需要用于插入, 不需要下推)

CREATE OR REPLACE FUNCTION public.gen_rand_img_sig(integer)  
 RETURNS signature  
 LANGUAGE sql  
 STRICT  
AS $function$  
  select ('('||rtrim(ltrim(array(select (random()*$1)::float4 from generate_series(1,16))::text,'{'),'}')||')')::signature;  
$function$;  

4、创建测试表 (cn)

create table t_img (id int primary key, sig signature);  

5、创建索引 (cn)

create index idx_t_img_1 on t_img using gist (sig);  

6、创建分片表(128 shard) (cn)

set citus.shard_count = 128;  
select create_distributed_table('t_img','id');  

7、写入4.5亿随机图像特征值

vi test.sql  
  
\set id random(1,2000000000)  
insert into t_img values (:id, gen_rand_img_sig(10)) on conflict(id) do nothing;  
pgbench -M prepared -n -r -P 1 -f ./test.sql -c 128 -j 128 -t 10000000  

写入约4.5亿随机图像特征值

postgres=# select count(*) from t_img;  
   count     
-----------  
 446953185  
(1 row)  
postgres=# select * from t_img limit 10;  
    id     |                                                                               sig                                                                                  
-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------  
  47902935 | (5.861920, 1.062770, 8.318020, 2.205840, 0.202951, 6.956610, 1.413190, 2.898480, 8.961630, 6.377800, 1.110450, 6.684520, 2.286290, 7.850760, 1.832650, 0.074348)  
 174656795 | (2.165030, 0.183753, 9.913950, 9.208260, 5.165660, 6.603510, 2.008380, 8.117910, 2.358590, 5.466330, 9.139280, 8.893700, 4.664190, 9.361670, 9.016990, 2.271000)  
  96186891 | (9.605980, 4.395920, 4.336720, 3.174360, 8.706960, 0.155107, 9.408940, 4.531100, 2.783530, 5.681780, 9.792380, 6.428320, 2.983760, 9.733290, 7.635160, 7.035780)  
  55061667 | (7.567960, 5.874530, 5.222040, 5.638520, 3.488960, 8.770750, 7.054610, 7.239630, 9.202280, 9.465020, 4.079080, 5.729770, 0.475227, 8.434800, 6.873730, 5.140080)  
  64659434 | (4.860650, 3.984440, 3.009900, 5.116680, 6.489150, 4.224800, 0.609752, 8.731120, 6.577390, 8.542540, 9.096120, 8.976700, 8.936000, 2.836270, 7.186250, 6.264300)  
  87143098 | (4.801570, 7.870150, 0.939599, 3.666670, 1.102340, 5.819580, 6.511330, 6.430760, 0.584531, 3.024190, 6.255460, 8.823820, 5.076960, 0.181344, 8.137380, 1.230360)  
 109245945 | (7.541850, 7.201460, 6.858400, 2.605210, 1.283090, 7.525200, 4.213240, 8.413760, 9.707390, 1.916970, 1.719320, 1.255280, 9.006780, 4.851420, 2.168250, 5.997360)  
   4979218 | (8.463000, 4.051410, 9.057320, 1.367980, 3.344340, 7.032640, 8.583770, 1.873090, 5.524810, 0.187254, 5.783270, 6.141040, 2.479410, 6.406450, 9.371700, 0.050690)  
  72846137 | (7.018560, 4.039150, 9.114800, 2.911170, 5.531180, 8.557330, 6.739050, 0.103649, 3.691390, 7.584640, 8.184180, 0.599390, 9.037130, 4.090610, 4.369770, 6.480000)  
  36813995 | (4.643480, 8.704640, 1.073880, 2.665530, 3.298300, 9.244280, 5.768050, 0.887555, 5.990350, 2.991390, 6.186550, 6.464940, 6.187140, 0.150242, 2.123070, 2.932270)  
(10 rows)  

查询性能

1、由于imgsmlr的一些类型没有写对应的send, recv函数接口,所以需要使用TEXT交互。CN设置参数如下

set citus.binary_master_copy_format =off;  

未设置时报错

WARNING:  42883: no binary output function available for type signature  
LOCATION:  ReportResultError, remote_commands.c:302  

2、创建生成随机图像特征值stable函数,便于测试。(所有节点)

create or replace function get_rand_img_sig(int) returns signature as $$  
  select ('('||rtrim(ltrim(array(select (random()*$1)::float4 from generate_series(1,16))::text,'{'),'}')||')')::signature;  
$$ language sql strict stable;  

3、性能

postgres=# select * from t_img order by sig <-> get_rand_img_sig(10) limit 1;  
    id     |                                                                               sig                                                                                  
-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------  
 565459043 | (1.790420, 9.463960, 7.089370, 5.888980, 0.974693, 2.148580, 6.153310, 9.098670, 2.815750, 7.625620, 7.598990, 7.141670, 7.189410, 4.630740, 3.673030, 7.820140)  
(1 row)  
  
Time: 612.839 ms  

4、执行计划

postgres=# explain (analyze,verbose,timing,costs,buffers) select * from t_img order by sig <-> get_rand_img_sig(10) limit 1;  
                                                                                         QUERY PLAN                                                                                            
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
 Limit  (cost=0.00..0.00 rows=0 width=0) (actual time=823.235..823.237 rows=1 loops=1)  
   Output: remote_scan.id, remote_scan.sig, remote_scan.worker_column_3  
   ->  Sort  (cost=0.00..0.00 rows=0 width=0) (actual time=823.233..823.233 rows=1 loops=1)  
         Output: remote_scan.id, remote_scan.sig, remote_scan.worker_column_3  
         Sort Key: remote_scan.worker_column_3  
         Sort Method: top-N heapsort  Memory: 25kB  
         ->  Custom Scan (Citus Real-Time)  (cost=0.00..0.00 rows=0 width=0) (actual time=823.185..823.200 rows=128 loops=1)  
               Output: remote_scan.id, remote_scan.sig, remote_scan.worker_column_3  
               Task Count: 128  
               Tasks Shown: One of 128  
               ->  Task  
                     Node: host=172.24.211.224 port=1921 dbname=postgres  
                     ->  Limit  (cost=0.67..0.97 rows=1 width=72) (actual time=151.011..151.012 rows=1 loops=1)  
                           Output: id, sig, ((sig <-> get_rand_img_sig(10)))  
                           Buffers: shared hit=5769  
                           ->  Index Scan using idx_t_img_1_106940 on public.t_img_106940 t_img  (cost=0.67..1052191.36 rows=3488100 width=72) (actual time=151.008..151.009 rows=1 loops=1)  
                                 Output: id, sig, (sig <-> get_rand_img_sig(10))  
                                 Order By: (t_img.sig <-> get_rand_img_sig(10))  
                                 Buffers: shared hit=5769  
                         Planning time: 1.021 ms  
                         Execution time: 156.785 ms  
 Planning time: 2.364 ms  
 Execution time: 823.577 ms  
(23 rows)  
postgres=# select * from t_img order by sig <-> get_rand_img_sig(10) limit 1;  
    id    |                                                                               sig                                                                                  
----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------  
 30290963 | (4.656000, 7.143380, 7.738080, 1.971150, 4.294430, 4.397560, 7.121350, 8.629690, 2.768710, 2.715320, 0.358493, 0.486682, 5.985860, 8.319860, 2.560290, 3.384480)  
(1 row)  
  
Time: 612.783 ms  
postgres=# select * from t_img order by sig <-> get_rand_img_sig(10) limit 1;  
     id     |                                                                               sig                                                                                  
------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------  
 1632633492 | (6.969460, 5.835990, 0.629481, 7.621580, 0.171138, 2.586950, 1.483150, 5.526530, 3.835270, 2.275350, 3.470760, 4.934100, 0.442193, 1.843810, 0.561291, 0.647721)  
(1 row)  
  
Time: 610.960 ms  

小结

使用citus,可以方便的扩展计算能力,提高PG的读写性能。

shard数目,建议参考worker节点的实际CPU核数量,建议不要超过核数,根据并发度的情况,考虑SHARD总数。

例如有8个WORKER节点,每个WORKER节点部署一个PG实例,每个WORKER节点32核。那么建议的shard数不要超过256(8*32)。如果并发很高,可以把shard数调低一点。

set citus.shard_count = 128;  
select create_distributed_table('t_img','id');  

参考

https://github.com/postgrespro/imgsmlr

《PostgreSQL 相似搜索插件介绍大汇总 (rum,pg_trgm,smlar,imgsmlr,pg_similarity) (rum,gin,gist)》

《PostgreSQL sharding : citus 系列1 - 多机部署(含OLTP(TPC-B)测试)》

目录
相关文章
|
17天前
|
人工智能 搜索推荐 数据管理
探索软件测试中的自动化测试框架选择与优化策略
本文深入探讨了在现代软件开发流程中,如何根据项目特性、团队技能和长期维护需求,精准选择合适的自动化测试框架。
68 8
|
24天前
|
定位技术 开发者
游戏开发者如何使用独享静态代理IP进行测试与优化
随着互联网技术的发展,使用代理IP的人数逐渐增加,特别是在业务需求中需要使用静态代理IP的情况越来越多。本文探讨了独享静态代理IP是否适用于游戏行业,分析了其优势如稳定性、不共享同一IP地址及地理位置选择等,同时也指出了需要注意的问题,包括可能的延迟、游戏兼容性和网络速度等。总体而言,选择合适的代理服务并正确配置,可以有效提升游戏体验。
24 2
|
1月前
|
人工智能 前端开发 测试技术
探索软件测试中的自动化框架选择与优化策略####
本文深入剖析了当前主流的自动化测试框架,通过对比分析各自的优势、局限性及适用场景,为读者提供了一套系统性的选择与优化指南。文章首先概述了自动化测试的重要性及其在软件开发生命周期中的位置,接着逐一探讨了Selenium、Appium、Cypress等热门框架的特点,并通过实际案例展示了如何根据项目需求灵活选用与配置框架,以提升测试效率和质量。最后,文章还分享了若干最佳实践和未来趋势预测,旨在帮助测试工程师更好地应对复杂多变的测试环境。 ####
48 4
|
1月前
|
人工智能 监控 测试技术
探索软件测试中的自动化框架选择与优化策略####
【10月更文挑战第21天】 本文深入剖析了软件测试领域面临的挑战,聚焦于自动化测试框架的选择与优化这一核心议题。不同于传统摘要的概述方式,本文将以一个虚拟案例“X项目”为线索,通过该项目从手动测试困境到自动化转型的成功历程,生动展现如何根据项目特性精准匹配自动化工具(如Selenium、Appium等),并结合CI/CD流程进行深度集成与持续优化,最终实现测试效率与质量的双重飞跃。读者将跟随“X项目”团队的视角,直观感受自动化框架选型的策略性思考及实践中的优化技巧,获得可借鉴的实战经验。 ####
36 0
|
26天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
57 1
|
28天前
|
机器学习/深度学习 人工智能 Java
探索软件测试中的自动化框架选择与优化策略####
本文深入探讨了在软件测试领域,面对众多自动化测试框架时,如何根据项目特性、团队技能及长远规划做出最佳选择,并进一步阐述了优化这些框架以提升测试效率与质量的策略。通过对比分析主流自动化测试框架的优劣,结合具体案例,本文旨在为测试团队提供一套实用的框架选型与优化指南。 ####
|
1月前
|
敏捷开发 监控 jenkins
探索自动化测试框架在敏捷开发中的应用与优化##
本文深入探讨了自动化测试框架在现代敏捷软件开发流程中的关键作用,分析了其面临的挑战及优化策略。通过对比传统测试方法,阐述了自动化测试如何加速软件迭代周期,提升产品质量,并针对实施过程中的常见问题提出了解决方案。旨在为读者提供一套高效、可扩展的自动化测试实践指南。 ##
43 9
|
1月前
|
jenkins 测试技术 持续交付
自动化测试框架的构建与优化:提升软件交付效率的关键####
本文深入探讨了自动化测试框架的核心价值,通过对比传统手工测试方法的局限性,揭示了自动化测试在现代软件开发生命周期中的重要性。不同于常规摘要仅概述内容,本部分强调了自动化测试如何显著提高测试覆盖率、缩短测试周期、降低人力成本,并促进持续集成/持续部署(CI/CD)流程的实施,最终实现软件质量和开发效率的双重飞跃。通过具体案例分析,展示了从零开始构建自动化测试框架的策略与最佳实践,包括选择合适的工具、设计高效的测试用例结构、以及如何进行性能调优等关键步骤。此外,还讨论了在实施过程中可能遇到的挑战及应对策略,为读者提供了一套可操作的优化指南。 ####
|
1月前
|
敏捷开发 监控 测试技术
探索自动化测试框架的构建与优化####
在软件开发周期中,自动化测试扮演着至关重要的角色。本文旨在深入探讨如何构建高效的自动化测试框架,并分享一系列实用策略以提升测试效率和质量。我们将从框架选型、结构设计、工具集成、持续集成/持续部署(CI/CD)、以及最佳实践等多个维度进行阐述,为软件测试人员提供一套系统化的实施指南。 ####
|
1月前
|
缓存 监控 测试技术
全网最全压测指南!教你如何测试和优化系统极限性能
大家好,我是小米。本文将介绍如何在实际项目中进行性能压测和优化,包括单台服务器和集群压测、使用JMeter、监控CPU和内存使用率、优化Tomcat和数据库配置等方面的内容,帮助你在高并发场景下提升系统性能。希望这些实战经验能助你一臂之力!
91 3

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版