我正在尝试运行一个 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 进行多少修改都无法解决这个问题。您有三个选择:
- 增加交换空间的大小。
- 安装更多 RAM。
- 重写你的程序以提高内存效率。