LINUX.ORG.RU

Скрипт на lua за 12 часов работы отъел 1412KB оперативы.

 


0

2

Скрипт на lua слушает events от freeswitch через ESL и обрабатывает их. Скрипт должен непрерывно выполняться пока работает freeswitch. ЗА 12 часов не было ни одного event-а, который нужно было обработать.
Однако при примитивной логике работы скрипта, скрипт разросся в оперативе
цифры из pmap собранных с интервалом 12 часов

# diff /tmp/lua1 /tmp/lua2
5c5
< 000000001ef86000   13308 rw--- 000000001ef86000 000:00000   [ anon ]
---
> 000000001ef86000   14720 rw--- 000000001ef86000 000:00000   [ anon ]
60c60
< mapped: 54848K    writeable/private: 20084K    shared: 0K
---
> mapped: 56260K    writeable/private: 21496K    shared: 0K

Хэш таблица (ключ->значение) с которой работает алгоритм не разрастается по числу ключей. ДА и за 12 часов алгоритм в нее ничего не писал. Алгоритм тупо считывал Event, анализировал поле event а, оно не совпадало и скрипт снова брал новый event. и при этом он разросся!!! Вроде немного, но вопрос. Скрипт планируется повесить на постоянку т.е. за год теоретически скрипт съест 1ГБ оперативы. Может и не съест, скрипт пока работает 12 часов.
Может какой то дамп из lua сбрасывать или из Linuх всего процесса чтобы посмотреть что именно разраствается. ИЛи может просто пустой блок памяти linuх lua резервирует.

★★★★

Ответ на: комментарий от rezedent12

не изучал fs для этого, но КМК что штатных средств для этого нет.
да и для чего fs будет генерить сообщение «остановись»? Может быть модуль ESL и должен - но это уже уровень хотелок/видения (архитектуры) разрабов fs
Чтобы мне дергать fs для этого специально - это уже параноя.
В моем скрипте есть коммент по этому поводу(соединение оборвалось, но ESL метод этого не видит). В этом кстати и есть проблема ESL модуля.
Кстати писал на perl похожий скрипт- там метод connected отрабатывает.

Vlad-76 ★★★★
() автор топика
Ответ на: комментарий от Vlad-76
[root@freeswitch1 lua]# diff /tmp/luajit_29963_11 /tmp/luajit_29963_12
5c5
< 0000000018e88000   13820 rw--- 0000000018e88000 000:00000   [ anon ]
---
> 0000000018e88000    1504 rw--- 0000000018e88000 000:00000   [ anon ]
50c50
< mapped: 49076K    writeable/private: 20744K    shared: 0K
---
> mapped: 36760K    writeable/private: 8428K    shared: 0K

Запустил через luaJit

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

Просто если бы я писал какую-то логику, которая должна работать круглосуточно - я бы, наверное, не стал связываться со скриптовыми языками. В том числе с lua, которая, ЕМНИП, была написана для игровых движков и для внедрения автоматизации в программы, написанные на других языках.

Контраргументы принимаются.

hobbit ★★★★★
()
Ответ на: комментарий от Vlad-76

а что по Вашему принципиально поменяется после переноса? Мне просто не очевидно.

Место под локальные переменные функций выделяется в стеке, при завершении функции оно освобождается.

f = io.open(«/tmp/email_body»,«w»)

Точно связи с внешним миром у скрипта нет?

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

Место под локальные переменные функций выделяется в стеке, при завершении функции оно освобождается.

Спорное утверждение. О каком стеке ты говоришь? Почему место освобождается? Ты всё ещё про Lua?

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

Так обычно поступают быдлокодеры.
Ты можешь скрипту послать какое нибудь сообщение штатным образом? Например через сокет?

сигналы - самый «штатный образ» обратиться к процессу. сокеты чтобы завершить процесс? а может ты быдлокодер, потерявший связь с внешним миром?

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

Спорное утверждение. О каком стеке ты говоришь? Почему место освобождается? Ты всё ещё про Lua?

Так во многих языках программирования устроено выделение памяти под функции.

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

сигналы - самый «штатный образ» обратиться к процессу. сокеты чтобы завершить процесс? а может ты быдлокодер, потерявший связь с внешним миром?

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

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

В котором заколебешься ждать пока подключишься к нему, при том что ejabberd на той же конфигурации отрабатывает влёт. Гуру молча разводят руками и говорят - «мало I/O, поэтому и тормозит». ejabberd почему-то при этом I/O вполне так хватает, хотя это тот еще монстр на фоне prosody

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

Ну, есть мнение(я сам не проверял), что он так тормозит и когда пользователей 5 и когда их 1000.

Меня-то как раз вариант с 1000 пользователей не волнует, просто руки никак не дойдут выкинуть его нафиг и заменить на ejabberd в качестве персонального XMPP-сервака.

Еще ж поддался на идею: «нафига ставить монструозный ejabberd, если пользоваться им буду только я и всякие интеграции с LDAP и прочее мне не надо?». Теперь жую кактус :-)

На работе-то как раз ejabberd стоит, надо было не выёживаться просто :-)

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte

просто руки никак не дойдут выкинуть его нафиг и заменить на ejabberd

А зря )

  • Ставишь jabberd
  • привязываешь учетки к номерам телефонов
  • закрываешь протокол
  • ???
  • тебя покупает Facebook за $19e9
makoven ★★★★★
()
Ответ на: комментарий от makoven

Пункт 3 - тот еще отстой, но меня здесь больше всего смущает последний пункт, где надо продаться телом и душой какой-нибудь сотоне. Спасибо, не надо :-)

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

Так во многих языках программирования устроено выделение памяти под функции.

Это не гарантирует, что в конкретной реализации Lua тоже так.

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

Так во многих языках программирования устроено выделение памяти под функции.

Это не гарантирует, что в конкретной реализации Lua тоже так.

Значит ли это что надо смирится не попробовав и не узнав?

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

Значит ли это что надо смирится не попробовав и не узнав?

Ты ещё посоветуй исполнить танец дебаггинга исполнить, а потом спроси, значит ли это, что надо смириться, не попробовав и не узнав.

Какой смысл в выполнении случайных операций без понимания сути происходящего?

Я вот смотрю на описание Lua, и вижу там две вещи, которые делают реализацию выделения переменных на стеке (как ты предположил) нецелесообразной. А ещё у меня есть ссылка на проект, который таки использует стек, но с помощью хаков. Правда, смысл проекта — не в освобождении памяти при выходе из функции, а несколько в другом. Даже немного наоборот.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от rezedent12

логично

То есть звать сборщик мусора каждый раз, как функция завершается? Что-то не очень логично.

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

То есть звать сборщик мусора каждый раз, как функция завершается? Что-то не очень логично.

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

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

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

Как просто-то. (На самом деле, нет.)

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

Я вот смотрю на описание Lua, и вижу там две вещи, которые делают реализацию выделения переменных на стеке (как ты предположил) нецелесообразной

Можно поинтересоваться что за вещи?

makoven ★★★★★
()

я бы не стал крутить непротестированный наколенкенаписанный скрипт ни на питоне, ни на луа, ни на чем-либо еще, надеясь, что все с ним ничего не произойдет на протяжении года, безотносительно потребления памяти. и рантаймы у всех них вполне могут течь, хотя и маловероятно в случае популярных имплементаций. а луа в современном мире считай эзотерический язык.

а разбираться, что и где течет (если вообще течет!), можно очень долго, и не ясно, если будет результат. это в случае, когда плохо знакомы с используемой технологией.

но главное: когда пишете что-то на таком языке, убедитесь, что он может автоматически перезапуститься без потери данных, если речь идет о 24/7 и от этого зависит ваше благополучие. я бы написал сервис для systemd (если вы не используете что-то другое) - для такого скрипта этого с головой хватит. настолько с головой, что я бы даже не стал искать, куда уходит память.

ESL модуль для python весит 5730702 байта, для lua 404207 байта.

это НИЧЕГО не значит. для начала попробуй запустить. хотя в вакууме python, наверное, потребляет больше памяти. ну и модулей для python для ESL вагон и тележка.

и не пишите функции по 100 строчек

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

«модулей для python для ESL вагон и тележка» где посмотреть?
по сколько строчек нужно писать функции?

Vlad-76 ★★★★
() автор топика
Ответ на: комментарий от r3lgar

Пример скрипта на python для приема event`ов от разработчиков freeswitch с while 1:

#!/usr/bin/env python

import string
import sys

from ESL import *

con = ESLconnection("localhost","8021","ClueCon")
#are we connected?

if con.connected:

  con.events("plain", "all");

  while 1:  #!!!!!!!   <<<<<<<
  #my $e = $con->recvEventTimed(100);
    e = con.recvEvent()

    if e:
      print e.serialize()

Vlad-76 ★★★★
() автор топика
Последнее исправление: Vlad-76 (всего исправлений: 1)
Ответ на: комментарий от makoven

что за вещи?

Сопрограммы и ANSI C.

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

Введение стека как понятия в язык усложняет его. Теперь нужно думать о времени жизни. Какой-то объект языка будет жить в куче, какой-то на стеке. Придётся думать, как быть если объект создан на стеке, а вставлен в таблицу в куче, или наоборот.

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

где посмотреть?

pip забанили?

https://pypi.python.org/pypi?:action=search&term=esl&submit=search

https://pypi.python.org/pypi/FreeSWITCH-ESL-Python/1.2

https://pypi.python.org/pypi/aioesl/0.1.3.3

https://pypi.python.org/pypi/python-ESL/1.4.18

и я не писал, что НАДО переписать на python. если уже есть работающий код, может оно того не стоит.

по сколько строчек нужно писать функции?

философский вопрос... не хочу говорить «твой код говно». код должно быть легко читать. меньше строчек = легче читать. если блок на 10-20 строчек делает очевидные вещи, его полезно вынести в функцию.

и не придется писать комментарии в конце блока возле end

чтобы понять, как это работает на длительном промежутке времени можно закомментировать sleep(5). если через пару минут, будет занято 200МБ, значит, что-то где-то течет. тогда ищи что.

и в while(true) нет ничего плохого. в императивном программировании это часто самый удобный вариант.

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

Ого! Он даже еще жив. Помню у сетя в локалке его гонял.

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

Да даже while true элегантнее.

Но вообще, цикл, который будет выполняться даже если его тело рухнуло к чертям и всё фейлится уже сотни проходов подряд — это глупо.

r3lgar ★★★★★
()

Может какой то дамп из lua сбрасывать или из Linuх

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
*/5 * * * * sync; echo 3 > /proc/sys/vm/drop_caches
dnb ★★★★
()
Ответ на: комментарий от anonymous

Что характерно, lua это не какой-то си или js. В луа ложью является false и nil. Так что можно while 0, while -1, while {}

makoven ★★★★★
()
Последнее исправление: makoven (всего исправлений: 1)
Ответ на: комментарий от RiseOfDeath

То, что вы никогда не ловили OOM, это не значит, что его нет.

Миф — это не вымысел, миф — это легенда, о которой все говорят, но его никто не видел. Это не утверждение существования, это лишь утверждение того, что его не видели.

То, что он есть, я не оспариваю, я оспариваю лишь его работоспособность.

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

Более чем работоспособен. Правда хм... для него абсолютно нормально на системе со 128 Гб памяти убить очень старый процесс, отожравший несколько десятков мегабайт.

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

не разбираюсь в программмировании, но очистка памяти где?

Она не нужна. Модные вмки сами типа всё чистят за говнокодерами.

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

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

И ты считаешь, что это можно назвать работой? Я бы даже с натяжкой не назвал его выполняющим свою функцию, так как он или убивает не того, или не приходит совсем. Но он есть.

r3lgar ★★★★★
()
19 февраля 2017 г.
Ответ на: комментарий от Vlad-76

Сообщаю, прошло 1,5 месяца как был запущен скрипт, скрипт и luajit при этом отнимает порядка 46-50МБ памяти. Временами больше, временами меньше (плавает)- видимо так и должно быть.
ЗА это время было несколько аварий на оборудовании абонентов - шли шквалы евентов.
Можно предположить и слегка надеяться что технология luajit не принесет головной боли на интервале 1,5 месяца.
Единственное что пока не оттестил - это аварии самого freeswitch при которой скрипт начинает крутиться в другом цикле.

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