PHP套接字服务器问题(mysql连接,最大连接数限制)

时间:2016-10-24 13:39:26

标签: php mysql sockets pdo

我需要编写一个套接字服务器,它将至少处理大约1000个(未来更多)低流量永久连接。我已经在PHP上制作了一个用于测试目的的草案版本(我们正在开发一个监控硬件,所以我们需要开发和测试会话协议和硬件功能),当我只连接几个客户端时,这非常适合我。但是当连接数量增加到10时,出现了一些关键问题。这里有一些关于服务器架构的信息:

我有一个主进程,它等待套接字连接并在连接时使用pcntl_fork()创建一个子进程(从现在开始为此连接提供服务)。此外,我正在主进程中设置与MySQL的PDO连接。所有子进程都共享同一个PDO对象。起初我害怕在同时查询期间遇到一些冲突,但我还没有遇到过它们,即使是通过压力测试(10个孩子在循环中不停地进行查询)。但是每个孩子都有睡眠(500000),所以它可能是幸运的,尽管我已经进行了几个小时的测试。但是,由于它们与服务器之间的罕见对话,即使在连接的1k客户端也不应出现此类负载。

所以这是我的第一个问题:对于大量子进程使用单个PDO对象是否安全(理想情况下会有大约1000个)?我可以为每个孩子使用单一连接,但MySQL几乎不支持连接。

第二个问题是获取寄生虫MySQL连接。正如我之前提到的,我只有一个PDO对象。但是当我连接了多个客户端,并且在他们运行了一些查询后,我在mytop中看到有多个数据库连接,我找不到连接数量和子进程数量之间的任何关联。例如,我有3个孩子,5个DB连接。我试图建立持久连接,并没有改变任何东西。

第二个问题:PDO是否为MySQL提供了额外的连接,或者它是MySQL驱动程序?有没有办法强迫他们使用一个连接?我不认为这可能是我的错,我的代码每次调用创建PDO对象的方法时都会向控制台发出警报,并且在分叉之前,在分叉之前只发生一次。之后,我只使用父级的PDO对象运行查询。由于MySQL的限制,我再也无法承受如此多的连接。

第三个问题:一千个套接字连接本身会出现问题吗?除了CPU和数据库负载,我的意思是。或者我应该做一些较小的服务器(例如128个连接),如果超过最大连接数,它将告诉客户端连接到另一个服务器?

提前感谢您的时间和可能的答案。

1 个答案:

答案 0 :(得分:0)

目前您首要关注的应该是套接字服务器架构。为每个客户分配流程非常繁重。 AFAIK平均PC可以容忍大约2000个线程,并且它不能快速工作。在进程之间切换意味着CPU应该将其状态保存在内存中,如果你有大量的进程,CPU将忙于内存IO,并且几乎没有时间实际做事。

您可能希望看一下Apache的灵感。在Apache中,他们使用固定数量的工作进程/线程,每个进程/线程通过select函数和套接字以非阻塞模式与多个客户端一起工作。这是一种更强大的方法。

关于数据库IO,我会生成一个进程/线程,它将是数据库连接的唯一所有者。工作进程将使用IPC(在进程的情况下)或无锁队列(在线程的情况下)与DB IO进程通信。这种方法使您独立于PDO实现细节(如果它是线程安全的,或者它是否产生连接等)。

<强> P上。 S。我怀疑你实际上生成了带有分叉的新PDO对象(分叉只意味着用它的内存及其中的所有内容制作进程的副本),PDO对象根据需要创建和关闭连接。这可以解释为什么你没有看到低流量客户端和数据库连接之间的相关性。