PHP 脚本被 OOM killer 杀死

PHP 脚本被 OOM killer 杀死

我正在尝试运行一个 PHP 脚本来从 MySQL 数据库中选择信息。这是一个简单的测试脚本:

$link = mysqli_connect($host, $user, $password, $database) or die("Error" . mysqli_error($link)); 
if (!mysqli_set_charset($link, "utf8")) {
    printf("Ошибка при загрузке набора символов utf8: %s\n", mysqli_error($link));
} else { 
$encod="encoding_ok";
}

echo "YO!!";
$query ="SELECT * FROM `spravka` LIMIT 500000";
$result = mysqli_query($link, $query) or die("error" . mysqli_error($link)); 
$pp="0";
echo "Did select!!";

 while($array_a = mysqli_fetch_assoc($result))

     {
$pp++;
..
}
echo $$pp;
?>

该脚本正在被 ubuntu 内核杀死。

日志显示

Apr 29 19:03:19 55234 kernel: [ 4261.409964] Out of memory: Kill process 5043 (php) score 507 or sacrifice child
Apr 29 19:03:19 55234 kernel: [ 4261.409967] Killed process 5043 (php) total-vm:454812kB, anon-rss:273600kB, file-rss:0kB" 

我检查了进程的 ID,ps aux | grep php由于某种原因,我得到的进程 ID 与我在日志中看到的不同,但我将两者的 oom 都更改了...)

我增加了 PHP 进程的内存

sudo bash -c "echo '-15' /proc/10600/oom_adj

然后我又增加了

sudo bash -c "echo '-1000' /proc/10600/oom_scope_adj

但它没有帮助。

我究竟做错了什么?

我如何检查 - 我通过选择 LIMIT 300 000 将请求的大小更改为 SQL - 这是有效的数字,但 LIMIT 400 000 已经不在每个 oom_adj 参数上 - 所以这意味着没有执行任何更改...

我尝试重新启动系统——没有结果。

我的系统:Ubuntu 12.04 / php 5 / Mysql 512mb RAM(不多,但对于一个脚本来说应该足够了!)

第二个小问题是,为什么我在 shell 中的命令中有一个进程 ID,而在同一个程序(php)的日志文件中却有另一个进程 ID?

答案1

如果调用了 OOM killer,则意味着系统的物理 RAM 和交换空间都已满。无论对 /proc 或 php.ini 进行多少修改都无法解决这个问题。您有三个选择:

  1. 增加交换空间的大小。
  2. 安装更多 RAM。
  3. 重写你的程序以提高内存效率。

相关内容