使用场景: 车间内 142 台 PC ,通过配置 ODBC ,执行插入数据到局域网内服务器上的 SQLServer 数据库,频率为每 10 秒一次。 每台 PC 对应服务器中的一个数据库,共 142 个数据库,每个库有 18 张表,单表最大字段 780 个。
车间 PC 操作系统为 Win7/XP,内存为 4G 。 服务器配置为 Xeon Gold 5218 ,内存 128G ,SQLServer 版本为 2019 社区版,默认安装默认配置。
异常现象: 偶尔会出现数据插入异常,PC 端报数据库写表失败。
可能问题:
麻烦各位大佬,给些建议或者指导,非常感谢。
1
Afar OP |
2
liprais 2022-03-09 13:24:36 +08:00
典型的生产者消费者场景
整个 kafka 或者 mq 完事 |
3
DollarKiller 2022-03-09 13:35:40 +08:00
这种场景典型上时序数据库呀
|
4
zzlhr 2022-03-09 13:40:20 +08:00
1.网络问题可能性不大,排查方法就是找一台失败的电脑连续 ping ,到出现失败查看是否丢包
2. 这个有可能,但是概率不大,原因可能是插入是锁表,看下是不是业务上使用触发器之类的,频繁写操作的表尽量避免使用触发器 3. 免费版 cpu 限制 4 核,还有内存限制的都很小,你这服务器配置性能完全没有发货。 4. 上述排除完毕之后还有问题就 使用 sqlserver 自带的分析工具 Sql Server Profiler 挺好用,也很简单 |
5
paradoxs 2022-03-09 14:06:59 +08:00
发到 MQ 上,慢慢拉
|
6
c6h6benzene 2022-03-09 14:09:52 +08:00 via iPhone
Service Broker 丢队列里慢慢消费?
|
7
Afar OP @liprais @DollarKiller PC 端软件是日本人写的,已经不可能更改了。
@zzlhr 非常感谢。SQL Server Profiler 能监测到远程客户端插入失败的情况么?我打开看了看,好像都是成功的日志。 |
8
Afar OP @paradoxs @c6h6benzene 如果能本地数据库转 MQ ,推送到服务器端的 Broker 上最好了。但是这样又需要去每台机器上配置部署,同时增加了 PC 端负担。
|
9
Itoktsnhc 2022-03-09 15:02:33 +08:00
架构不调整的话首先该做的是对 SQL Server 以及所在机器的状态做一个监控,结合客户端报错的时间看指标,比如 CPU 情况,内存情况,网络流量情况,数据库连接数,是否存在死锁这些
|
10
mingl0280 2022-03-09 15:50:02 +08:00 via Android
2 和 3 完全不可能,高度怀疑是 ODBC 插入代码有问题。
|
11
PopRain 2022-03-09 16:20:19 +08:00
社区版你就算有 128G 内存,它也只会用 1G 内存(数据库文件 MAX 10G)。。。。你建这么多数据库,本身就耗费缓存内存,缓存要不停交换到硬盘肯定影响插入效率,如果可以改,最好不要超过 10 个数据库
另外,可以先装个开发版试试(免费 180 天),如果没有问题,预算有限可以买个 WEB 版(max 64G),话说这么“豪华”的服务器都买了,舍不得买个标准版的数据库。。。。 如果这样,为什么不用 postgresql 呢? |
12
PopRain 2022-03-09 16:31:08 +08:00
补充一下,如果客户端可以配置连接端口的话,是不是可以测试一下多安装几个实例,监听不同端口,这个不知道微软是否限制为共享 1G 内存,还是各自 1G
|
13
Afar OP |
14
Afar OP PC 客户端是 WIN7/XP ,只能通过 ODBC 到服务器数据库,服务器端是 Windows Server 2016 ,如何实现多实例呢? VMware 么?
|
15
kiracyan 2022-03-09 16:49:36 +08:00
你的社区版确定没阉割吗?
|
16
Afar OP @kiracyan 我也看不来有没有阉割,这是 select @@version 查询出来的
Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Express Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 16299: ) |
17
adoal 2022-03-09 17:36:08 +08:00 via iPhone
“数据插入异常”时的具体表现是什么,服务器返回的错误码?客户端抛出的异常?日志里的记录?如果什么都没有,那不好猜。
|
18
PrinceofInj 2022-03-09 18:26:09 +08:00
@Afar 直接新安装一个数据库,选评估版就行了。企业版的功能,180 天评估器,足够排查了吧。继续运行安装程序,选命名实例就是多实例了。
|
19
netnr 2022-03-09 18:53:51 +08:00 via Android
判决大概率是版本问题,先换一个开发版观察是否依然出现问题,EE 版本限性能和大小
换个思路分析,142 台每 10 秒写入同一个数据库也顶得住 |
20
kiracyan 2022-03-09 19:41:41 +08:00
@Afar 建议升级企业版 我之前公司上千台写入都没什么问题 服务器的系统版本时 win server 吗 我看你信息是 win10 版本的
|
21
PopRain 2022-03-09 20:48:53 +08:00
@Afar SQL SERVER express 最大只能用 1G 内存,你还开了这么多 database , 你可以安装一个开发版测试一下,我觉得肯定有改善,你这个数据量对 SQL server 来说不算什么。
|
22
qile1 2022-03-10 01:08:45 +08:00 via Android
把服务器虚拟化成多个系统,每个系统安装 sql server
|
23
zzlhr 2022-03-10 14:44:13 +08:00
如果超市 SQL Server Profiler 应该是监测不到的,但是你可以看成功的执行时间是多久,如果排队会出现很多执行时间很长的 sql ,而且目前看来很明确是版本问题了。sqlserver 缓存池跟用户量和数据库大小,运行时间都有直接联系,缓存池都是在内存里,楼上说了限制 1g 我不知道准确不,没仔细看,但是就算不是也不会超过 4g ,就你这个使用情况内存是不够的
|
24
PopRain 2022-03-22 14:11:11 +08:00
楼主最后把结果告诉大家一下
|
25
Afar OP @PopRain
谢谢各位。 由于是生产车间,且设备数量较多,稳妥起见,两个方案同步进行。 1. 将 Express 版本升级到企业版。 2. 数据插入频率由 10s 改为 60s 。 更改后,报警数量明显减少,但是很遗憾,没有找到具体原因。 |