LINUX.ORG.RU

Сообщения sotlef

 

Маршрутизатор с PPPoE вместо WiFi-роутера?

Форум — Talks

Давно в голове сидит идея перед домашним WiFi-роутером поставить маршрутизатор с PPPoE. Когда вайфаем дома активно пользуются все члены семьи, то есть подозрение, что скорость проседает не только от того, что скорость распределяется между несколькими устройствами, но и от того, что сам роутер нагревается и работает медленнее, вплоть до зависания (после перезагрузки работа восстанавливалась).

Насколько моя идея жизнеспособна? Маршрутизаторы до 30тыс.руб. по железу мощнее WiFi-роутеров?

Дома стоит TP-Link Archer C5, тариф на 700мбит

 ,

sotlef
()

Обработка ошибки Out of memory

Форум — Development

Всем привет,

Подскажите куда смотреть. Имеется софтинка, которая активно использует ОЗУ, причем пользователи могут туда залить много данных и написать правила обработки этих данных так, что если правила написали неудачно, то софтинка может выжрать всю память.

Ожидается, что если доступная память закончилась, (своп отключен, оом киллер тоже отключен) процесс из аллокатора получит ошибку, что память кончилась и процесс закончит обработку запроса пользователя и освободит выделенную память.

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

[<ffffffffb244e13d>] mem_cgroup_oom_synchronize+0x16d/0x590
[<ffffffffb23cdad4>] pagefault_out_of_memory+0x14/0x90
[<ffffffffb29aaf88>] mm_fault_error+0x6a/0x15b
[<ffffffffb29bfa61>] __do_page_fault+0x4a1/0x510
[<ffffffffb29bfb05>] do_page_fault+0x35/0x90
[<ffffffffb29bb7b8>] page_fault+0x28/0x30
[<ffffffffffffffff>] 0xffffffffffffffff

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

 ,

sotlef
()

Научите готовить бинарник, чтобы addr2line распознавал адреса функций

Форум — Development

Всем привет, хочу найти утечку с помощью функций mtrace/muntrace, но не могу понять, почему утилита addr2line не может перевести адрес в код и строку.

Вот демо-пример:

#include <mcheck.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
    mtrace();

    for (int j = 0; j < 2; j++)
        malloc(100);            /* Never freed--a memory leak */

    calloc(16, 16);             /* Never freed--a memory leak */
    exit(EXIT_SUCCESS);
}

Пробовал собирать с разными уровнями включения отладочных символов:

g++ -g test.cpp -o test
g++ -g3 -ggdb test.cpp -o test
g++ -g3 test.cpp -o test
g++ -O0 -g3 test.cpp -o test
g++ -g -rdynamic test.cpp -o test
g++ -g3 -rdynamic test.cpp -o test

Запускаю приложение: MALLOC_TRACE=/tmp/test.log ./test

Получаю вывод с помощью команды mtrace ./test /tmp/test.log:

Memory not freed:
-----------------
           Address     Size     Caller
0x00005586d69a6690     0x64  at 0x5586d6472190
0x00005586d69a6700     0x64  at 0x5586d6472190
0x00005586d69a6770    0x100  at 0x5586d64721a5

Утилита mtrace пытается конвертировать адреса в читабельные строки в коде с помощью addr2line, но ничего не выходит. Что я делаю не так?

Дополнительная информация:

  1. Когда в malloc включена трассировка, адреса вызывающих функцию malloc/realloc/free функций определяются через встроенную в gcc функцию: __builtin_return_address(0)
  2. Далее этот адрес через функцию dladdr преобразуется в пару <бинарник>[адрес]
  3. утилита mtrace использует далее парсит пару <бинарник>[адрес] и отдает addr2line

 ,

sotlef
()

AddressSanitizer GCC + custom halt

Форум — Development

Всем привет,

Вопрос такой, допустим имеется многопоточная программка, в которой срабатывает ASan, завершая процесс с выводом ошибки.

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

 

sotlef
()

Подскажите подходящий алгоритм сжатия

Форум — Development

Вопрос к тем, кто интересуется алгоритмами сжатия без потерь, может можете подсказать?

В программе имеется utf8-символьный массив (на самом деле их много таких массивов), в котором последовательно размещены строки: количество байт строки, потом содержимое строки, снова количество байт строки, содержимое строки и т.д. Хотелось бы этот массив ужать каким-нибудь известным алгоритмом так, чтобы при необходимости я мог зная индекс начала строки разархивировать только ее. Строки короткие, в среднем где-то до 300 символов. Строки в основном осмысленный текст на русском, либо коды на латинице (шаблонные, как правило очень короткие до 10 символов).

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

 ,

sotlef
()

Вывод длинных строк в GDB

Форум — Development

Всем привет, подскажите что нужно сделать, чтобы отладчик не обрубал вывод содержимого длинной строки?

Допустим во время отладки я хочу вызвать метод node->toString().

Я пишу в интерактивной строке отладчика: call node->toString().

В ответе получаю: $1 = "<тут строка 256 символов>"... т.е. в выводе значения результата я получил только первые 256 символов, а дальше ...

Как заставить отладчик показывать всю строку?

 

sotlef
()

Ограничение максимальной доступной памяти процессом

Форум — Development

Всем привет.

Девопсы настраивают OOM killer, чтобы процессы в контейнере не потребляли памяти больше заданного порога. Софт в контейнере - некоторая самопальная СУБД, которая все данные хранит в памяти. Если пользователь загружает данных в СУБД больше порога, OOM killer благополучно убивает процесс, и девопсы бегут к разработчикам разбираться, почему сервер в очередной раз упал :-)

В общем, чтобы девопсы отвалили, хочу в сервер добавить параметр максимального потребления ОЗУ, чтобы он знал что нельзя выделять памяти больше, чем стоит в ограничении.

Понимаю, что можно заменить аллокатор в new/delete, и перед выделением данных в динамической памяти проверять этот порог, но может есть готовые решения? хотя бы для линукса, допустим в glibc может какая функция есть, которая в глобальную переменную в malloc порог запишет?

Или может быть в настройках процессов можно искусственно ограничить процесс, чтобы при привышении порога malloc возвращал nullptr?

 , ,

sotlef
()

Поддержка нескольких веток ПО в Git

Форум — Development

Всем привет!

Имеется некоторый продукт, у которого выпущено уже большое количество версий. По определенным причинам заказчики не всегда спешат менять минорные версии продукта. Таким образом для разных заказчиков поддерживаются несколько веток, допустим актуальные 1.2, 1.3, 1.4 и master, где разрабатывается будущий 1.5 в рамках выпущенных минорных версий исправляем только багфиксы и к примеру заказчик в версии 1.2.5 заметил ошибку, ее исправили в версии 1.2.6. Исправление нужно распространить на 1.3, 1.4 и master, допустим выпустив новые патч-релизы 1.3.8, 1.4.2. Исправления для выпуска 1.2.6 делались в отдельных багфик-ветках и пулреквестом заливались в ветку 1.2.6.

Вопрос - как лучше поступить? Создавать отдельные пулреквесты из багфикс-веток в 1.3.8 и 1.4.2, master или после выхода 1.2.6 сделать большой пулреквест в 1.3.8 и 1.4.2 и мастер из 1.2.6? Или просто смерджить? Вопрос лежит больше в чистоте логов гит и простоте поддержки версий.

 ,

sotlef
()

Санитайзер памяти для С++

Форум — Development

Всем привет!

Кто знает, как такое может быть? Собираю тестовый пример с санитайзером памяти:


int main (int argc, char** argv) {
  char *p = new char[1024];
  sleep (20000);
  delete [] p;
  return 0;
}

Собираю приложение так:
g++ test.cpp -o test -fsanitize=address

После запуска в `ps aux | grep test` вижу, что приложение запросило 20Тб виртуальной памяти

`g++ -version`:
`g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0`

Как так может быть? Кроме того я не могу запросить сам такие объемы при желании

 

sotlef
()

postgres + http_get

Форум — Development

Всем привет.

Вопрос тут скорее к разработчикам на сайте, чем к админам наверное... Кто знает, в плагине к Postgres `http_get` при вызове http_get каждый раз создается новое TCP-соединение к серверу, которое закрывается после получения ответа или все-таки он держит соединение между вызовами?

С точки зрения исходника этого плагина на самом деле еще больше вопросов - почему в нем имеются глобальные переменные и как сервер поддерживает потокобезопасность в нем

Решение базируется на библиотеке curl, хранит глобальный CURL *g_http_handle. Но насколько я знаю функции curl не потокобезопасные и для каждого отдельного клиента нужно создавать отдельный CURL * https://github.com/pramsey/pgsql-http/blob/master/http.c

 ,

sotlef
()

GTK на windows

Форум — Development

Всем привет.

Знаю, что некоторых тут коробит от слова windows (других от слова коробит), но решил залезть в улей и спросить у тех, кто хорошо знает архитектуру gtk и gnome.

Насколько сложно под виндой добиться полной схожести стилей gtk-шных программ с линуксовыми. Т.е. хотелось бы в поставку приложения добавить стили gnome, чтобы даже можно было скрыть заголовок виндового окна с кнопками свернуть, закрыть, развернуть и перерисовывать его как в gnome.

Насколько я понимаю, тут раскраска окна должна работать по типу как рисовался старый winamp (на окно натягиваем шкурку с полным переоформлением окна)

 , ,

sotlef
()

Синхронизация задач в очереди без явного ожидания

Форум — Development

Всем привет!

Имеется некоторый проект числодробилки, в нем красной линией проложена очередь задач. Любой запрос от клиента обрабатывается в задаче.

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

Классический вариант с ожиданием завершения моей группы задач не подходит - ожидая завершения потоков я блокирую один из небольшого числа потоков, который можно было бы задействовать для обработки других запросов:

// Этап 1
auto taskGroup = threadPool.createTaskGroup ();
while (conditionToCreateManyJobsIsTrue ()) {
   addJob (taskGroup, []() {
     //Do some job
   });
}

// Тут мы блокируем один из потоков очереди
// Хуже еще то, что если количество запросов от клиентов будет больше или равно количеству потоков в очереди, то при таком решении сервер просто навсегда зависнет
taskGroup.join ();

// Этап 2 аналогичен по структуре распараллеливания этапу 1
...

Если исходить из того, что действия на 2-ом этапе выполняются после завершения последней задачи на этапе 1 приходит идея, чтобы каждая лямбда функция держала объект со счетчиком ссылок, и действия 2-го этапа начались в деструкторе этого объекта.


std::shared_ptr< NextStage > nextStage = sugarWrapperToCreateExceptionGuardedDestructorClass ([]() {
    // Действия на 2-ом этапе
});

// Этап 1
auto taskGroup = threadPool.createTaskGroup ();
while (conditionToCreateManyJobsIsTrue ()) {
   addJob (taskGroup, [=nextStage]() {
     //Do some job
   });
}

Теперь код задачи после комментария

// Этап 1
завершает свою работу и освобождает поток, который может быть использован для выполнения полезной работы Балансировка нагрузки на ядра процессора тоже довольно ровная

Но мне не нравится, что я определяю 2-ой этап до первого, и поэтому код воспринимается хуже. Если этапов будет еще больше, то определять их нужно в обратном порядке.

У кого-нибудь есть идеи как еще можно решить эту задачу?

 

sotlef
()

Git с централизованным репозиторием

Форум — Development

Всем привет

Объясните плз, в чем преимущество git перед svn, если используется централизованный репозиторий кода? Пришел на проект. В нем 2 разработчика, используют гит, разработчики друг с другом сливали между собой изменения.

Я в проекте реализую отдельную функциональность, для которой уже развернут svn-репозиторий. Я сразу был этому рад, так как никаких религиозных проблем с выбором vcs не имею, но svn знаю намного лучше git. Спросил у коллег, почему они его не используют. Ничего внятного мне не сказали, одно мычание. В их группу пришел еще один разработчик - они задумались над централизованным репозиторием, но это должен быть git-репозиторий. Обсуждают возможность купить корпоративный акк на gitbucket, на мои вопросы о целесообразности отвечают что я просто люблю svn, а им нравится git.

И да, они используют TortoiseGit для работы :-) Позже я узнал, что этот хайп с гитом накрыл практически всю контору в других городах. Теперь уже мне приходится объяснять, почему я использую svn вместо git.

Чего в гите такого крутого?

 

sotlef
()

Легкий веб-браузер (ищу новость)

Форум — Talks

Всем привет,

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

Кто помнит эту новость-тему, напишите плз ссылку. Все перерыл, не нашел. Код на гитхабе вроде выкладывали

 ,

sotlef
()

Распространенность GLib в open source

Форум — Development

Всем привет

Кто знает, как сейчас обстоят дела с использованием GLib на не-GNOME системах? Раньше насколько знаю GLib использовался в Qt, т.е. библиотека использовалась в KDE в любом случае. Допустим если я гипотетически захочу создать некоторое ПО консольное, которое будет зависеть от GLib, используя всю его функциональность, не окажется ли, что найдется много людей, которые скажут, что не захотят его ставить, так как придется еще GLib тянуть?

 

sotlef
()

Сообщение Password в ssh

Форум — Admin

Подскажите, как поменять сообщение выводимое для ввода пароля в ssh В одних системах выводится Password: в других $username password: Как настроить это сообщение?

 

sotlef
()

Properties, Vala

Форум — Development

Всем привет

Подскажите, как исправить синтаксические ошибке в этом коде?

using Gee;

public class Property : Object 
{}

public class PropertiesHolder : Object {
    private Gee.List<Property> props;

    private Object createProperty() {
        props.add(new Property ());
        return props.last();
    }

    public Object property {
        get {
            return (unowned) createProperty ();
        }
    };
}

Компилятор пишет:

$valac test.vala --pkg gee-0.8
test.vala:16.30-16.43: error: syntax error, expected `;'
            return (unowned) createProperty ();
                             ^^^^^^^^^^^^^^
test.vala:20.1-20.0: error: syntax error, expected get, set, or construct

В чем тут проблема?

 

sotlef
()

Асинхронное сообщение от сервера

Форум — Web-development

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

 ,

sotlef
()

Объясните принцип разгадывания головоломки-капчи на странице регистрации MonoDevelop

Форум — Talks

Пытаюсь зарегистрироваться на странице http://monodevelop.com/Special:UserRegistration. В качестве капчи мне предлагают решить головоломку, нужно угадать символы и цифры - с цифрами вроде понятно, там уравнения, а по какому принципу нужно догадаться какое слово зашифровано? Пример не привожу, просто зайдите по ссылке. Причем некоторые блоки капчи разделены запятыми, другие точкой с запятой - что это может значить?

sotlef
()

Массив. Перемещение элементов

Форум — Development

Млин. Сижу, туплю. Может кто поможет:

Есть коллекция элементов. На вход приходит массив пар <старая_позиция, новая позиция элемента>. Коллекция для перемещения имеет только операцию ПЕРЕМЕСТИТЬ(старая_позиция, новая), которая при перемещении сдвигает старый элемент на новой позиции вправо. Как мне обработать входной массив, чтобы в результате все элементы находились на указанных позициях?

Когда 1 элемент - все просто, но перемещение второго элемента может подпортить положение 1го

Пример:

a b c d e f g h - элементы коллекции
1 2 3 4 5 6 7 8 - их старое положение
8 1 7 5 2 4 3 6 - новое

sotlef
()

RSS подписка на новые темы