Форум программистов, компьютерный форум, киберфорум
Go (Golang)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/22: Рейтинг темы: голосов - 22, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 62

Утечка памяти при передачи данных по udp

29.04.2021, 20:26. Показов 4501. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые коллеги. Пишу udp клиент, которые с определённой скоростью отправляет данные. Дабы соблюсти тайминги и задержки операцию отправки данных я запускаю в новой горутине каждый раз. При этом у меня происходит утечка памяти (если отправлять данные последовательно уточки не происходит, но это мне не подходит). Я подумал, может параллельно net.Udpconn использовать не очень хорошая идея, и воткнул мьютекс, чтобы горутины на отправку запускались параллельно, но сама операция выполнялась по очереди, но это не помогло, если кто сталкивался с подобным, поделитесь опытом. Спасибо!

Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
func SendData(dataSendEnd chan struct{}) {
    conn, err := net.DialUDP("udp", nil, *&dest)
    defer func() {
        conn.Close()
        fmt.Println("Goroutine sending data finished")
        dataSendEnd <- struct{}{}
    }()
 
    if err != nil {
        fmt.Fprintf(os.Stderr, "error: %v\n", err)
        panic(1)
    }
 
    i := 0
    var wg sync.WaitGroup
    var mu sync.Mutex
 
    for currentData := range dataChan {
        if i == packetCount {
            time.Sleep(timeSync * time.Millisecond)
            i = 0
        }
 
        wg.Add(1)
        go func(data []byte) {
            defer wg.Done()
            mu.Lock()
            _, err := conn.Write(currentData)
            mu.Unlock()
            if err != nil {
                fmt.Fprintf(os.Stderr, "error: %v\n", err)
            }
        }(currentData)
        i++
    }
    wg.Wait()
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.04.2021, 20:26
Ответы с готовыми решениями:

Утечка памяти при большом количестве входных данных
Доброго времени суток. Вчера писал о своей проблеме, думал что проблема в рациональности алгоритма, но нет. Мне нужно реализовать алгоритм...

Особенности передачи данных по протоколу ТСР и UDP.
Особенности передачи данных по протоколу ТСР и UDP. помогите ответить на этот вопрос

UDP. Как реализовать возможность передачи разного количества данных?
Здравствуйте. Возник такой вопрос: Есть UDP приемник #pragma comment (lib, &quot;ws2_32.lib&quot;) #include &quot;stdafx.h&quot; #include...

5
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
30.04.2021, 04:20
Цитата Сообщение от Tandemic Посмотреть сообщение
Я подумал, может параллельно net.Udpconn использовать не очень хорошая идея, и воткнул мьютекс, чтобы горутины на отправку запускались параллельно, но сама операция выполнялась по очереди
У тебя в горутинах ничего нет, кроме этой операции. Зачем тебе тут горутины?

Цитата Сообщение от Tandemic Посмотреть сообщение
Дабы соблюсти тайминги и задержки операцию отправки данных я запускаю в новой горутине каждый раз.
Как тайминги и задержки связаны с горутинами?

Добавлено через 48 секунд
Цитата Сообщение от Tandemic Посмотреть сообщение
*&
— это зачем?
0
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 62
30.04.2021, 09:52  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
У тебя в горутинах ничего нет, кроме этой операции. Зачем тебе тут горутины?
Для реализации выбора скорости отправки я считаю, сколько пакетов я должен отправлять каждые 100 мс(time.sleep на это же время стоит), таким образом, чтобы не считать сколько времени у меня занимает отправка этой порции и вычитать это время из задержки я минимизирую это горутиной. Вот трафик с горутинами и без для скорости 50 мбит/c.
Кликните здесь для просмотра всего текста


Цитата Сообщение от korvin_ Посмотреть сообщение
Как тайминги и задержки связаны с горутинами?
Выше объяснил

Цитата Сообщение от korvin_ Посмотреть сообщение
— это зачем?
dest это указатель на net.UDPAddr
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
type destFlag struct{ net.UDPAddr }
 
func (f *destFlag) String() string {
    return (*&f.UDPAddr).String()
}
 
func (f *destFlag) Set(s string) error {
    if UDPAddr, err := net.ResolveUDPAddr("udp", s); err == nil {
        f.UDPAddr = *UDPAddr
        return nil
    } else {
        return fmt.Errorf("Not valid destination %q", s)
    }
}
 
func DestFlag(name string, dest, usage string) *net.UDPAddr {
    ParseAddr, _ := net.ResolveUDPAddr("udp", dest)
    f := destFlag{*ParseAddr}
    flag.CommandLine.Var(&f, name, usage)
    return &f.UDPAddr
}
 
var dest                 = DestFlag("dest", "127.0.0.1:60000", "Dest address")
P.S Проблема оказалось в чрезмерном количестве горутин, ограничив их количество память перестала кушаться. Но мне всё равно не очень понятно, что криминального в том что их много запускалось, ведь они быстро завершались.
0
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 62
30.04.2021, 10:04  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
— это зачем?
Так исправил, тупанул)
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
30.04.2021, 12:15
Цитата Сообщение от Tandemic Посмотреть сообщение
Вот трафик с горутинами и без для скорости 50 мбит/c.
Который из них с горутинами, а который — без?

Цитата Сообщение от Tandemic Посмотреть сообщение
Но мне всё равно не очень понятно, что криминального в том что их много запускалось, ведь они быстро завершались.
Видимо, они создавались быстрее, чем завершались.
0
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 62
30.04.2021, 12:30  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Который из них с горутинами, а который — без?
Тот который с нужной скорость с горутинами

Цитата Сообщение от korvin_ Посмотреть сообщение
Видимо, они создавались быстрее, чем завершались.
Вот это я объяснить не могу, для отладки я сделал горутину, которая выводит текущее количество горутин каждые пол секунды, и это количество постоянно росло, хотя трафик оставался одинаковым, что показывает, что количество горутин, которые его плюют должно быть примерно одни и тоже. Так же я поэкспериментировал с ограничением их количества. Например для 100 мбит нужно 1000 горутин. Так же ещё одна странность что например для 50 мбит количество одновременно запущенных горутин отличается в зависимости от их максимального количества.

Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
i := 0
    var wg sync.WaitGroup
    gorutinesLimiter := make(chan struct{}, 5000)
 
    for currentData := range dataChan {
        fmt.Println(string(currentData))
        for repeat := 0; repeat < *repetitions; repeat++ {
 
            if i == packetCount {
                time.Sleep(timeSync * time.Millisecond)
                i = 0
            }
 
            wg.Add(1)
            gorutinesLimiter <- struct{}{}
            go func(data []byte) {
                defer wg.Done()
                if _, err := conn.Write(data); err != nil {
                    fmt.Fprintf(os.Stderr, "error: %v\n", err)
                }
                <-gorutinesLimiter
            }(currentData)
            i++
 
        }
    }
    wg.Wait()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.04.2021, 12:30
Помогаю со студенческими работами здесь

Разработать библиотеку процедур для приёма-передачи данных по сети на основе протокола UDP
Здравствуйте. Вот задание. Разработать библиотеку процедур для приёма-передачи данных по сети на основе протокола UDP и текст для её...

Утечка памяти при рекурсии
Здравствуйте. Столкнулся ч тем, что я, похоже, неправильно составил алгоритм рекурсии. При запуске получаю ошибку связанную с памятью....

Утечка памяти при удалении
Здравствуйте! Возникла проблема при удалении последнего элемента из двусвязного списка. Вот код, где я добавляю элемент в конец...

Утечка памяти при ping'e...
OS: Win7 VS 8 ************ Всем привет. Помогите определить и устранить утечку памяти. Нужен конкретный ответ именно по...

Утечка памяти при вызове функции
Здравствуйте. Объясните пожалуйста почему возникает утечка памяти при вызове функции get_msg_error. int get_msg_error( const...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru