2009-05-30 79 views
1

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

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


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

我的最佳选择是获得正在运行当前脚本的Postgresql线程的非常准确的PID,并带有NOTIFY-LISTEN。 由于[depesz]告诉Postgres只使用1个核心。与schedtool我仍然可以控制它运行的核心和cpulimit我可以进一步控制它。

回答

0

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

如果你坚持用nicing postgres,“SELECT pg_backend_pid()”会给你postgres进程的PID,而不用任何NOTIFY/LISTEN的东西。虽然,一般来说,你不想尝试一个postgres过程。您可能会导致其他更高优先级的进程被阻止。那么你认为低优先级的过程不再那么低优先级。

如果你只是从一个csv做一堆插入,你的脚本可能没有多大帮助。 Postgres可能会做更多的工作,而且可能是IO,所以再次,nicing可能不会给你带来太多。然而,你可以每隔一段时间睡一觉。插入50毫秒,睡一会儿,...

0

Postgres后端总是从邮政局长进程产生的,所以没有办法通过亲和力(不管这将是)从PHP脚本选项Postgres后端。另一方面 - 如果你要描述什么样的亲和力,以及你想要设置/传递什么样的选择,也许有一个解决方案 - 事实上没有一般的解决方案,并不意味着有些东西没有专门的解决方案。

+0

当然。 Schedtool为给定进程设置CPU调度参数。例如,在我的情况下,我将该进程设置为仅使用我CPU上的2个核心。这被称为亲和力。我也可以设置NICE级别。 更多信息请访问:http://linux.die.net/man/8/schedtool – Ikon 2009-05-30 11:09:18

+0

客户端应用程序无法在服务器上设置好级别 - 在您的情况下,php应用程序无法在postgresql后端设置好级别。 至于设置应用程序是否可以使用1个或2个内核 - 没有太多意义,因为1个PostgreSQL后端将始终只使用1个内核。 – 2009-05-30 11:52:30