Apache 2.0 жрёт всю память, валит систему. (300 юзеров онлайн качают 50 метров,)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модератор: SLEDopit

Ответить
bogdasha
Сообщения: 4
Контактная информация:

Apache 2.0 жрёт всю память, валит систему.

Сообщение bogdasha »

Помогите разобраться, сколько оперативной памяти гарантировано доступно для нас в любое время.

При поступлении от клиента запроса на порт 80 к архивному файлу в 50 мегабайт Апач получает команду загрузить файл с диска в оперативную память. Если наша клиентская эксешка даёт запрос Апачу взять с первого по пятый байт 50-ти мегабайтного файла, то загружается ли 50-ти мегабайтный файл полностью в оперативную память или же в оперативную память Апач кладёт только с первого по пятый байт?

Сколько оперативной памяти нужно будет поставить нам в сервер 1У чтобы 300 юзеров качали онлайн 16 мегабайт из 50-ти мегабайтного файла.

Помогите побороть долбаный Апач.

Спасибо,
с уважением
bogdasha
Спасибо сказали:
Аватара пользователя
Shura
Сообщения: 1537
Статус: Оказывается и без KDE есть жизнь
ОС: FreeBSD 8.0-RC2

Re: Apache 2.0 жрёт всю память, валит систему.

Сообщение Shura »

Клиент не может обратиться к 5-му или любому другому байту файла через http. Это не smb и не NFS. Единственное, что может клиент - укачать этот файл к себе. А там уж пусть делает с ним все, что захочет.
Rock'n'roll мертв © БГ
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Apache 2.0 жрёт всю память, валит систему.

Сообщение sash-kan »

Для Shura:
а мне помнится, что есть в http заголовки, позволяющие качать файл с определенной позиции. скорее всего и скачиваемый диапазон определить можно.
или я, как всегда, не о том? :)
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Apache 2.0 жрёт всю память, валит систему.

Сообщение flook »

(bogdasha @ Четверг, 04 Августа 2005, 21:37) писал(а):При поступлении от клиента запроса на порт 80 к архивному файлу в 50 мегабайт Апач получает команду загрузить файл с диска в оперативную память. Если наша клиентская эксешка даёт запрос Апачу взять с первого по пятый байт 50-ти мегабайтного файла, то загружается ли 50-ти мегабайтный файл полностью в оперативную память или же в оперативную память Апач кладёт только с первого по пятый байт?

Меньше чем 4Kb процессу не выделяют. Если apache попросит замапить 1байт, то ему выделять 4Kb и создадут mapping (cat /proc/pid/maps) опять-таки на 4Kb. Другое дело, если он протсто делает read() из файла.
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус
Контактная информация:

Re: Apache 2.0 жрёт всю память, валит систему.

Сообщение KiWi »

(Sash Kan @ Пятница, 05 Августа 2005, 11:01) писал(а):Для Shura:
а мне помнится, что есть в http заголовки, позволяющие качать файл с определенной позиции. скорее всего и скачиваемый диапазон определить можно.
или я, как всегда, не о том?  :)

есть такое... с какого по какой кусок :-)
Спасибо сказали:
bogdasha
Сообщения: 4
Контактная информация:

Re: Apache 2.0 жрёт всю память, валит систему.

Сообщение bogdasha »

Детализация ворпоса:

Ссылка на странице вида http://domen:80/file.zip

ссылку одновременно кликают 5000 юзеров.

Вопрос:
Сколько оперативной памяти в сервере нужно максимум чтобы Apache 2.0 не загнулся со своим параметром, типа ServerType inetd.

И зачем вообще во второй версии убрали ServerType standalone? Чем они его заменили, кто знает? Максклиентами и всяким хламом? Всеравно ведь каждый запрос на 80-й порт порождает копию Apache в памяти. А если качать в несколько потоков? тут 300 гиг оперативки нехватит под такую гадость.

Встряхните бицепсами, ребят :megalol: кому не лень повісить лишний раз свой рейтинг Гуру.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Apache 2.0 жрёт всю память, валит систему.

Сообщение sash-kan »

Для bogdasha:
а почему бы не зайти с другого конца? :)
есть такой замечательный протокол под названием ftp.
придумывался он именно для того, чтобы файлы можно было с машины качать.
(почти) в любом количестве и (почти) любого размера.

так что, если задача позволяет, может быть имеет смысл переключить внимание с http на более специализированный протокол?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
bogdasha
Сообщения: 4
Контактная информация:

Re: Apache 2.0 жрёт всю память, валит систему.

Сообщение bogdasha »

Вопрос решён пока только так, но требует дальнейщей доработки:

Поскольку 2-я апача уже не содержит ServerType standalone и вообще уже не содержит ServerType, то пришлось поменять /etc/rc.d/init.d/httpd из состояния inetd в состояние demon:

Код: Выделить всё

#!/bin/bash
#
# httpd        Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web server.  It is used to serve \
#        HTML files and CGI.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd.pid

# Source function library.
. /etc/rc.d/init.d/functions

if [ -f /etc/sysconfig/httpd ]; then
        . /etc/sysconfig/httpd
fi

# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}

# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""

# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.

# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/sbin/apachectl
httpd=${HTTPD-/usr/sbin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0

# check for 1.3 configuration
check13 () {
    CONFFILE=/etc/httpd/conf/httpd.conf
    GONE="(ServerType|BindAddress|Port|AddModule|ClearModuleList|"
    GONE="${GONE}AgentLog|RefererLog|RefererIgnore|FancyIndexing|"
    GONE="${GONE}AccessConfig|ResourceConfig)"
    if LANG=C grep -Eiq "^[[:space:]]*($GONE)" $CONFFILE; then
  echo
  echo 1>&2 " Apache 1.3 configuration directives found"
  echo 1>&2 " please read /usr/share/doc/httpd-2.0.53/migration.html"
  failure "Apache 1.3 config directives test"
  echo
  exit 1
    fi
}

# The semantics of these two functions differ from the way apachectl does
# things -- attempting to start while running is a failure, and shutdown
# when not running is also a failure.  So we just do it the way init scripts
# are expected to behave here.
start() {
        echo -n $"Starting $prog: "
        check13 || exit 1
        LANG=$HTTPD_LANG daemon $httpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}
stop() {
    echo -n $"Stopping $prog: "
    killproc $httpd
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
    echo -n $"Reloading $prog: "
    if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
        RETVAL=$?
        echo $"not reloading due to configuration syntax error"
        failure $"not reloading $httpd due to configuration syntax error"
    else
        killproc $httpd -HUP
        RETVAL=$?
    fi
    echo
}

# See how we were called.
case "$1" in
  start)
    start
;;
  stop)
    stop
;;
  status)
        status $httpd
    RETVAL=$?
;;
  restart)
    stop
    start
;;
  condrestart)
    if [ -f ${pidfile} ]; then
  stop
  start
    fi
;;
  reload)
        reload
;;
  graceful|help|configtest|fullstatus)
    $apachectl $@
    RETVAL=$?
;;
  *)
    echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtes
t}"
    exit 1
esac

exit $RETVAL


bogdasha добавил в 06.08.2005 13:09

Объясните, что менять для 900 юзеров онлайн качающих в 2 потока:

<IfModule prefork.c>
StartServers 2
MinSpareServers 5
MaxSpareServers 20
ServerLimit 900
MaxClients 900
MaxRequestsPerChild 4000
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers 2
MaxClients 900
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>

# perchild MPM
# NumServers: constant number of server processes
# StartThreads: initial number of worker threads in each server process
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# MaxThreadsPerChild: maximum number of worker threads in each server process
# MaxRequestsPerChild: maximum number of connections per server process

<IfModule perchild.c>
NumServers 5
StartThreads 2
MinSpareThreads 1
MaxSpareThreads 2
MaxThreadsPerChild 3
MaxRequestsPerChild 30
</IfModule>
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Apache 2.0 жрёт всю память, валит систему.

Сообщение sash-kan »

(bogdasha @ Суббота, 06 Августа 2005, 12:09) писал(а):пришлось поменять /etc/rc.d/init.d/httpd из состояния inetd в состояние demon

сразу выпал в осадок :)
потом перечитал тему, оказывается - проглядел я упоминание про inetd :(
товарищ bogdasha, Вы имеете представление, что такое inetd и что получается, если такую частоиспользуемую (по крайней мере у Вас) программу, как httpd, будет запускать демон inetd?

сам и отвечу - загибаться будет машина. со страшной силой.
не стоит httpd запускать через ж., извините, через inetd
разве что дома или на сайте с двумя посещениями в месяц (включая webmaster'а) :)
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
bogdasha
Сообщения: 4
Контактная информация:

Re: Apache 2.0 жрёт всю память, валит систему.

Сообщение bogdasha »

С этим понятно.
Теперь интересует следующее:

900 юзеров онлайн качают 50-ти метровый файл в 2 потока.

Что нужно изменить в конфигурации Apache 2.0 для того чтобы сервер не орал на меня Cannot allocate memory или Cannot open file, meny files open in system, или ещё Cannot fork new proccess

Что нужно менять в:

<IfModule prefork.c>
StartServers 2
MinSpareServers 5
MaxSpareServers 20
ServerLimit 900
MaxClients 900
MaxRequestsPerChild 4000
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers 2
MaxClients 900
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>

# perchild MPM
# NumServers: constant number of server processes
# StartThreads: initial number of worker threads in each server process
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# MaxThreadsPerChild: maximum number of worker threads in each server process
# MaxRequestsPerChild: maximum number of connections per server process

#<IfModule perchild.c>
#NumServers 5
#StartThreads 2
#MinSpareThreads 1
#MaxSpareThreads 2
#MaxThreadsPerChild 3
#MaxRequestsPerChild 30
#</IfModule>
Спасибо сказали:
Ответить