【发布时间】:2017-03-06 07:42:18
【问题描述】:
我需要编写一个套接字服务器,它至少可以处理大约 1000 个(将来会更多)低流量的永久连接。我在 PHP 上制作了一个草稿版本用于测试目的(我们正在开发一个监控硬件,所以我们需要开发和测试一个对话协议和硬件功能),当我只有几个客户端连接时,它非常适合我。但是当连接数量增加到十个时,出现了一些关键问题。这里有一些关于服务器架构的信息:
我有一个主进程,它等待套接字连接,并在连接时使用 pcntl_fork() 创建一个子进程(从现在开始提供此连接)。我也在主进程中建立到 MySQL 的 PDO 连接。所有子进程共享同一个 PDO 对象。起初我担心在同时查询期间会遇到一些冲突,但我没有遇到它们,即使通过压力测试(10 个孩子在循环中不停地进行查询)。但是每个孩子都有usleep(500000),所以这可能是运气,尽管我已经运行了这个测试几个小时。但是即使连接了 1k 个客户端,这种负载也不应该存在,因为它们与服务器之间的对话很少。
这是我的第一个问题:对大量子进程(理想情况下大约有 1000 个)使用单个 PDO 对象是否安全?我可以为每个孩子使用单个连接,但 MySQL 几乎不支持那么多连接。
第二个问题是获取寄生 MySQL 连接。正如我之前提到的,我只有一个 PDO 对象。但是当我连接了多个客户端,并且在他们运行了一些查询之后,我在 mytop 中看到有多个 DB 连接,并且我找不到连接数量和子进程数量之间的任何相关性我有.例如,我有 3 个孩子和 5 个数据库连接。我尝试建立持久连接,但并没有改变任何东西。
第二个问题:是 PDO 与 MySQL 建立了额外的连接,还是 MySQL 驱动程序?有没有办法强迫他们使用一个连接?我不认为这可能是我的错,每次我调用创建 PDO 对象的方法时,我的代码都会向控制台打印一个警报,而且这只发生一次,在脚本开始时,在分叉之前。之后,我只使用父级的 PDO 对象从子级中运行查询。再一次,由于 MySQL 的限制,我无法承受如此多的连接。
第三个问题:一千个socket连接本身会不会是个问题?除了 CPU 和数据库负载,我的意思是。或者我应该做一些较小的服务器(例如 128 个连接),如果超过最大连接数,它将告诉客户端连接到另一个服务器?
提前感谢您的时间和可能的答案。
【问题讨论】:
-
为什么要在应用程序和数据库之间建立一层?你听说过连接池和连接重用吗?我不想听起来粗鲁,但您的经验似乎不足以为您描述的这么大的项目构建服务。
-
您的评论没有任何粗鲁之处,我在该领域确实没有太多经验,这基本上就是我问这个问题的原因。但我们都必须从某个地方开始,你知道的。我也不知道连接池是什么,但根据我们的计算,一个数据库连接就足以满足我们的需求(在最坏的情况下,每秒的简单查询不应该超过 2 个)。正如我现在所看到的,我的问题是对分叉的工作原理缺乏了解。