LINUX.ORG.RU
ФорумAdmin

perl, apach ограничение ресурсов


0

0

название топика может не совсем верное но как назвать по другому не придумал)
суть проблемы в том что если на сервере выполняется cgi скрипт например:

#!/usr/bin/perl
print «Content-Type: text/html\n\n»;
print (1..60000000);

то система намертво зависает. понятно что не хватает процессора\оперативки на обработку массива в 60 миллионов ячеек.
но как сделать чтобы ОС не зависала ну хотя бы ошибка выдавалась или что бы скрипт не загружал процессор на 100%?
ещё я постоянно сижу из под root если создать пользователя и заходить с него может система сама будет ограничивать ресурсы?
ОС ubuntu 9.04
сервер apache 2.2.11

★★★★★

> система сама будет ограничивать ресурсы
man ulimit

я постоянно сижу из под root

Не стоит так делать. Кроме того, apache всё равно запускается из-под своего пользователя (www-data).

AITap ★★★★★
()
Ответ на: комментарий от AITap

добавил в файл ulimit.conf строчки:
root hard as 100000
www-data hard as 100000
* hard as 100000

если в командною строку вписать например:
perl -e 'my @i=(1..60000000);'
выдаёт ошибку оут мемори.
если записать это в файл и запустить файл через командную строку то он завершается всё норм

но если запустить этот же файл через сервер как cgi то компьтер наглухо виснет. как так? почему на cgi лимит не распространяется??

TDrive ★★★★★
() автор топика
Ответ на: комментарий от sdio

я всю систему перезагрузил после того как апачь её намертво повесил)

TDrive ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

а приоритет апачу 19 чтобы он выполнялся после других приложений? приоритет мне кажется отвечает за очередь к процессору а тут дело в нехватке оперативки думаю получится что процесс также забьёт всю оперативку будит висеть ждать очередь на выполнение.

TDrive ★★★★★
() автор топика

ulimit -a

покажи

sdio ★★★★★
()
Ответ на: комментарий от TDrive

омг туплю уже)
оперативка 640 мб (512 + 128)

вывод
root@ubuntu:~# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) 100000
file locks (-x) unlimited

TDrive ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

да не в апаче\перле дело они работают почти как часы. просто если умышленно на апаче запустить cgi скрипт который жрёт кучу оперативки система его никак не лимитирует хотя в конфиге прописал лимит для всех пользователей.

TDrive ★★★★★
() автор топика
Ответ на: комментарий от TDrive

Так вы же скрипты пишете: неужели нельзя проверить сначала, сколько памяти надо будет скрипту, а потом уже забивать ее данными?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

>Так вы же скрипты пишете: неужели нельзя проверить сначала, сколько памяти надо будет скрипту, а потом уже забивать ее данными?

+1
А еще я советую ему на search.cpan.org сходить,там есть вспомогательные утилиты

pinachet ★★★★★
()
Ответ на: комментарий от Eddy_Em

>Так вы же скрипты пишете: неужели нельзя проверить сначала, сколько >памяти надо будет скрипту, а потом уже забивать ее данными?
можно но это костыли а не решение проблемы.
1) я могу ошибиться
2) скрипты общаются с БД и принимают информацию от пользователей через get,post понятно что любой ввод нужно проверять но опятьже можно ошибиться.
3)это не спортивно) ulimit должно работать а не работает значит или я ошибся или что то не так(скорее первое).

так что буду разбираться всем спс за помощь.

TDrive ★★★★★
() автор топика
Ответ на: комментарий от TDrive

2) скрипты общаются с БД и принимают информацию от пользователей через get,post понятно что любой ввод нужно проверять но опятьже можно ошибиться.

Почему-то, когда пишут программы на С, ввод проверяют на соответствие выделяемым объемам памяти: не зря же есть функции strncpy, snprintf и т.п. Может, вам стоит писать на С, а не на перле?

По поводу ulimit (если не хотите писать как положено): может вам стоит в начале скрипта вставить ulimit -d .. -l .. -v .. ?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

причём тут скрипты и как и на чём их пишут?
задам вопрос по другому: как на хостингах выставляют ограничения на оперативку, процессорное время? например если регнусь на агаве и запущу свой скрипт на перле не думаю что сервер агавы повиснет). как они выставляют лимиты?

может вам стоит в начале скрипта вставить ulimit -d .. -l .. -v ..

вот кстате вопрос возник
попробовал поставить в скрипт print `whoami`; он послушно напечатал www-data
потом попробовал print `ulimit -a`; и он ничего не выдал. к чему бы это? помойму ulimit -a должна от любого пользователя работать.

ещё тут подумал может быть такое что limit.conf читается только при логине в систему? в случае с апачем он запускается от рута и потом запускает перл от www-data по этому limit.conf и не работает?

TDrive ★★★★★
() автор топика
Ответ на: комментарий от TDrive

помойму ulimit -a должна от любого пользователя работать.

ulimit - встроенная функция bash, в виде отдельного исполняемого файла не существует. Если в этом вашем перле нет ulimit, напишите свой (который будет работать с /proc).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

в перле и не должо быть ulimit :)
в перле есть оператор `` который вводит команды в консоль и принимает вывод.

TDrive ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.