LINUX.ORG.RU

Curl жрет 158 Мб !!

 ,


0

1

Требуется постоянно грепать информацию с сети, для этого использую curl. Но микрозапросов довольно много, а каждый запрос «кушает» весьма прилично - 158 мб RAM! Памяти на сервере совсем не много и к такой объем ресурсов для такой простой операции видится избыточным.

Есть ли способ урезать занимаемый курлом размер памяти любым пусть даже экзотическим способом? Возможно есть какая-то утилита, которая бы выделила основную часть всех процессов на подобие архиватора, а вновь появляющиеся бы строились на основе? Или быть может есть настройка в курле лайт режим? Можно ли курс собрать облегченный? Вообще любые советы приветствуются!

«кушает» весьма прилично - 158 мб RAM! Памяти на сервере совсем не много

Ты хоть номер карты напиши, непонятно куда кидать пожертвования на модуль памяти в 256Мб.

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

Если эти процессы curl запускаются под отдельным пользователем, можешь настроить для него ограничения.

https://www.opennet.ru/base/sys/ulimit_mc.txt.html

Vsevolod-linuxoid ★★★★★
()
Последнее исправление: Vsevolod-linuxoid (всего исправлений: 2)

zram,uksm cgroups- swappines, limitbytes....

anonymous
()
Ответ на: комментарий от Vsevolod-linuxoid

В том-то и дело, что нужно как-то запустить больше процессов, а если я ограничения поставлю, то получится что запущу меньше..

fenicks
() автор топика

А твой сервер от этого как-то страдает или ты пытаешься чинить то, что не сломано?

Deleted
()
Ответ на: комментарий от fenicks

Ну можешь просто запускать их с малым приоритетом, чтобы они остальному не мешали в системе.

Vsevolod-linuxoid ★★★★★
()
Ответ на: комментарий от fenicks

ulimit -m 48000 # Ограничиваем максимальный размер резидентной части процесса (находящейся в ОЗУ) в 48 MB — из статьи по ссылке выше.

Vsevolod-linuxoid ★★★★★
()
Последнее исправление: Vsevolod-linuxoid (всего исправлений: 1)

Я сильно сомневаюсь, что Curl’у активно нужно столько памяти. Если это объём виртуальной памяти, то непонятно, в чём проблема вообще. Виртуальная память виртуальна.

Если ресурсов прям совсем мало, нужно смотреть в сторону специализированной программки, в которой будет реализованы исключительно только нужные части HTTP.

i-rinat ★★★★★
()

man curl на предмет --range

anonymous
()

Требуется постоянно грепать информацию с сети

Если запросы простые, то легче написать свою программу или поискать упрощённую альтернативу Curl.

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

Чего уж проще - получать курлом чанками заданного размера?

anonymous
()
Ответ на: комментарий от i-rinat

Ну вот, опять пошло разрушение любителей зачётных ключиков и твиков реестра.

anonymous
()
Ответ на: комментарий от i-rinat

Оно BSD-специфично, в POSIX не определено, в Linux было только до 2.4.30.

anonymous
()

Посмотри massif'ом, куда именно утекает память - скорее всего баг на твоей стороне

annulen ★★★★★
()
Ответ на: комментарий от i-rinat

Значит плохо искал. Там тупо дергается setrlimit с RLIMIT_RSS. Но оно естественно не будет делать того, что хочет ТС, процесс просто грохнется, или в лучшем случае перестанет что-либо качать

annulen ★★★★★
()

а каждый запрос «кушает» весьма прилично - 158 мб RAM

158 — это VSZ, RSS или PSS?

gremlin_the_red ★★★★★
()

Пересобери курл с polarssl например

slowpony ★★★★★
()

Попробуй wget, aria2.

anonymous
()

Ещё можно выучить Perl или готовый однострочник загуглить

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

2 мегабайта от силы. Может буферы потюнить? Почему никто не задаётся вопросом НА ЧТО ушла память?

anonymous
()
Ответ на: комментарий от i-rinat

Разумеется, виртуальная

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
23635 alex      20   0  186648   9180   7932 S   8.3  0.1   0:04.65 curl

Я выше на то ТСу и намекаю - не стоит чинить то, что не сломано.
Если у него там миллион микрозапросов - дергать курл на каждый действительно глупо, но совсем по другим причинам.

Deleted
()

Памяти на сервере совсем не много и к такой объем ресурсов для такой простой операции видится избыточным.

Добавить память на сервере и не считать ничтожные мегабайты. Вопрос полностью отвечен, и обсуждать больше нечего.

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

Я не виноват! Они спрятали логику в таблицы, чтобы ввести меня в заблуждение.

i-rinat ★★★★★
()

ботоводы должны страдать :)

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

Дык это VIRT, а RES всего 9190к

там в /proc/<pid>/smaps можно найти несколько кусков по 64Мб отмапленных в никуда.

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

Ну а я что написал? Слово «разумеется» не всегда обозначает сарказм - иногда это просто согласие с собеседником :).

Deleted
()
Ответ на: комментарий от vel

Я по-моему собирал хелловорлд с libcurl, там хорошо так меньше мегабайта RES был, емнип. Вызывался в кроне, мне не понравилось что приложение curl так долго запускалось и жрало столько памяти. На самом деле у меня там пароли плейнтекстом были, это ещё одна из причин была.

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

Если нет тредов, то нет адской разницы VSZ/RSS

Проблема в glibc и в тредах на x86_64. На x86 такой ситуации нет.

Но x86 закапывают все кто может, начиная со сломанного PAE в 4.14

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

процесс просто грохнется, или в лучшем случае перестанет что-либо качать

$ grep -R RLIMIT_RSS
include/uapi/asm-generic/resource.h:#ifndef RLIMIT_RSS
include/uapi/asm-generic/resource.h:# define RLIMIT_RSS		5	/* max resident set size */
include/asm-generic/resource.h:	[RLIMIT_RSS]		= {  RLIM_INFINITY,  RLIM_INFINITY },	\
arch/mips/include/uapi/asm/resource.h:#define RLIMIT_RSS		7	/* max resident set size */
fs/proc/array.c:		rsslim = ACCESS_ONCE(sig->rlim[RLIMIT_RSS].rlim_cur);
fs/proc/base.c:	[RLIMIT_RSS] = {"Max resident set", "bytes"},

Не похоже, чтобы этот параметр хоть на что-то влиял.

i-rinat ★★★★★
()
Ответ на: комментарий от annulen

А ты точно RLIMIT_RSS с RLIMIT_AS не путаешь?

Я сейчас сделал ulimit -m 32, что должно ограничить объём резидентной памяти до 32 килобайт. Но выжирающая память тестовая программа как кушала гиг, так и продолжает успешно кушать. /usr/bin/time говорит: «(0avgtext+0avgdata 1053972maxresident)k». С ulimit -v в определённый момент malloc() возвращает NULL.

i-rinat ★★★★★
()

олсо, zram еще не предлагали?

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

На сокетах накатать можно просто же. Вполне возможно что там у него не используется что-то прям такое требующие дояига кода или сторонних библиотек.

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