【问题标题】:Can spawned Postgresql process be controlled by the spawner PHP script?生成的 Postgresql 进程可以由 spawner PHP 脚本控制吗?
【发布时间】:2010-10-30 02:12:36
【问题描述】:

我有一个 PHP CLI 脚本,它处理一个 csv 文件,将它的内容插入到 Postgresql 数据库中的一个表中。这是在 Ubuntu 服务器上。我使用 schedtool 来控制整个脚本的亲和力。 Schedtool 用于使用 -e 选项启动脚本本身。不幸的是,使用 htop 我看到数据库线程是作为一个完全不同的线程生成的,并且不受关联选项的影响。

是否有可能以某种方式使数据库进程从 spawner PHP 脚本继承所有关联选项?


我刚刚找到了答案——因为我正在阅读一些 Ruby 的 Postgresql 示例文件:)。

我最好的选择是通过 NOTIFY - LISTEN 获取运行当前脚本的 Postgresql 线程的准确 PID。 正如 [depesz] 所说,Postgres 仅使用 1 个核心。使用schedtool,我仍然可以控制它在哪个内核上运行,而使用cpulimit,我可以进一步控制它。

【问题讨论】:

    标签: php linux postgresql command-line ubuntu


    【解决方案1】:

    Postgres 不使用线程。每个连接都由一个单线程进程处理。因此,单个连接只能使用一个核心。尽管操作系统可能会将其移至不同的内核,但它一次只能使用一个。

    如果您坚持使用 postgres,“SELECT pg_backend_pid()”将为您提供 postgres 进程的 PID,而无需任何 NOTIFY/LISTEN 内容。不过,一般来说,您不想尝试改进 postgres 进程。您可能会导致其他更高优先级的进程阻塞。那么你认为的低优先级进程不再是低优先级了。

    如果您只是从 csv 进行大量插入操作,那么优化您的脚本可能无济于事。 Postgres 可能正在做更多的工作,它可能是 IO,所以再一次,nicing 可能不会让你得到太多。但是,您可以偶尔睡觉。插入50毫秒,休眠一会,...

    【讨论】:

    • 非常感谢!我又学到了很多东西 :) 现在我重组了我的剧本并适应了新的想法。
    【解决方案2】:

    没有。

    Postgres 后端总是从 postmaster 进程产生的,因此无法将关联(无论是什么)选项从 php 脚本传递到 postgres 后端。

    另一方面 - 如果您要描述什么是亲和力,以及您想要设置/传递什么样的选项,也许有一个解决方案 - 没有通用解决方案的事实并不意味着存在不是针对某些事情的专门解决方案。

    【讨论】:

    • 当然。 Schedtool 为给定进程设置 CPU 调度参数。例如,在我的情况下,我将进程设置为仅使用 CPU 上 2 个内核中的 1 个。这称为亲和力。我也可以设置 NICE 级别。更多阅读:linux.die.net/man/8/schedtool
    • 客户端应用程序无法在服务器上设置 nice 级别 - 在您的情况下,php 应用程序无法在 postgresql 后端设置 nice 级别。至于设置应用程序是否可以使用 1 个或 2 个核心 - 这没什么意义,因为 1 个 PostgreSQL 后端将始终只使用 1 个核心。
    • 那么,我不应该打扰单独的 postgres 线程,因为它只会一直使用 1 个核心?这会很好,因为我的目标是最小化整体负载。您能否推荐一些有关此问题的文档和教程(Postgres 负载平衡)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2011-03-03
    相关资源
    最近更新 更多