我有一个实时交通计算系统,使用自动车辆定位(AVL)。
我可以知道车在哪里,现在在哪里,计算距离和时间可以估计这些道路上的交通速度。我有两个商店程序:
near_link使用avl (x,y)找到近路段create_route采用压浆加长、电流环和前一环,可以计算出车辆行驶的路线。这两个进程都是线性的,计算1行的near_link需要10 ms,计算100行需要1000 ms或1秒。计算一条路线的费用要高出一升,一条路线是50毫秒,100条路线是5秒。
问题是avl车队的增长,所以现在我收到的不是400 avl/min,而是2000 avl/min。现在我需要的不是400*60ms = 24 sec,而是2000*60 = 120 sec,所以每分钟我只能处理一半的数据。
我现在能想到的唯一解决方案是有两个分开的服务器,一个处理偶数car_id,另一个处理奇怪的car_id,因此在两个服务器之间分配负载。
目前,我只使用一个生产桌面,Windows i3核心3Ghz 8gb内存正常磁盘。我可以为生产服务器要求一个更好的硬件。例如,我知道查询非常需要HDD,因为需要经常检查map_rto表,但是我可以看到在资源监控CPU和内存中的使用率很低。所以我可以升级到SDD磁盘。希望我的时间减少到一半。
但是当舰队增加到4000 avl/min或8000 avl/min时会发生什么呢?这些线性计算的规模有哪些策略?
现行设计的一般描述:
我喜欢使用pgAgent和触发器将数据从一个阶段移动到另一个阶段的想法。但也许有更好的方法。

avl_pool表中car_id、x、y、azimuth、datetime。near_link和route。x, y, azimuth试图找到与该位置最接近的链接。我每分钟从一个pg_agent作业中调用这个sp。traffic_avl表发布于 2017-01-29 20:39:35
由于您怀疑磁盘是限制因素,如果您专注于硬件,升级到SSD听起来是您最好的选择。如果允许缓存大多数慢速表/索引,更多的RAM也可能工作。( map_rto及其最常用的索引有多大?)
如果您希望尝试调优已经拥有的硬件,或者在购买硬件之前确保这确实是问题所在,那么您应该从存储过程中识别出缓慢的查询,并为它们遵循这个建议。
特别有用的是打开track_io_timing并为缓慢的查询发布EXPLAIN (ANALYZE, BUFFERS)。
最后,调用这两个函数的代码是单线程的吗?如果是这样的话,您可以尝试将其并行化,为每个线程提供不同的数据库连接。
https://dba.stackexchange.com/questions/162120
复制相似问题