我已经疯狂了两天了,我正在寻求帮助。
我有一个用 delphi 开发的程序(大约 2000 年代初期),可以访问 firebird v3 数据库,当前安装在同一台机器上(windows server 2016 x64 - db 和程序是 x86)。
该机器是在 vmware esxi 上配置的 VM,我来谈谈要点:如果我仅使用 1 个 vCPU 配置 VM,则程序运行得很好,如果我还使用 2 个 vCPU(1 个插槽和 2 个核心)或更多配置它,性能就会减半。
问题是,只留下一个 vCPU,即使只是对于 Windows 服务器作业(例如搜索更新和其他内容),CPU 也会永远保持 100%。
你有什么建议吗?
PS:我无法切换到firebird x64,因为许多库都是x86。
PPS:虚拟机上的操作系统是 Windows Server 2016 Standard ed
答案1
让客户机使用一个 CPU。并在清单中记录有关此客户机的一些注释中的原因。
更多地关注满足应用程序性能指标,而不是像 CPU 利用率这样误导性的基本指标。交互式应用程序是否响应迅速?批量查询是否在可接受的时间内完成?如果是,就不要担心 CPU。
编辑:“锁定”级别的性能不佳不在您的原始问题中,这是重要的背景。解决这个问题可能值得付出一些额外的努力:
- 安排数据库关闭的维护时间,以应用更新和其他任务。
- 增加 CPU,并应用其他评论提到的应用程序级 CPUAffinity 配置,将其锁定为一个。
答案2
如果您将进程关联性固定到单个核心,则另一个核心将保持空闲,供其他进程使用。根据实际的调度问题,可能需要将 Firebird 服务器固定到同一个核心或其他核心。
但是,由于 ESXi 也会虚拟化 CPU 核心,因此它会继续在物理核心之间移动 vCPU 核心。您可能还需要修复虚拟机与特定核心的亲和性。
您应该意识到,这种调整是由代码错误或软件严重过时造成的。您应该认真考虑更新代码。
答案3
这是 FireBird 的一个已知问题。
我确实管理过一些使用 FireBird 来运行各种软件的客户,而且多线程状态很难用 .conf 来配置,但首先您必须安装 Firebird 并且按照多 CPU 使用所需的设置进行设置,即经典服务器。
如果您想确定的话,请不要忘记客户端应用程序也需要多线程安全库。
Thread-safe Client Library Dmitry Yemanov Vladyslav Khorsun Alex Peshkov Tracker reference CORE-707. The client libraries, including the embedded one, can now be used in multi-threaded applications without any application-level
同步。