|
Память не освобождается
|
|||
---|---|---|---|
#18+
Всем привет, решил написать рутрекер небольшой файлообменник для локальных нужд. Из браузера post-запросом отправляется файл с "Content-Type": "multipart/form-data", на бэкэнде AspCore его принимаем, Zip'уем его, присваиваем идентификатор и сохраняем на диск, чтобы потом можно было вернуть. Я протестировал на файле большого объема - 460мб, проблема в том, что после каждого вызова метода контроллера отъедается дополнительная память и не освобождается. Статистика динамики потребления памяти приложения при загрузке вышеуказанного файла такая: 1-вызов+152мб к текущему уровню потребления 2-вызов+228мб к текущему уровню потребления 3-вызов+141мб к текущему уровню потребления Метод отрабатывает корректно и потребление памяти при выходе из контроллера не падает вообще никак. Не могу понять какой объект держит память. Код: c# 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. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82.
Сравнил два снимка памяти-при только что запущенном приложении и когда уже несколько раз прогнал загрузку файла. Наибольшая разница по размеру составляет "AsyncTaskMethodBuilder"- то есть как будто я запускаю очень много Task, что не соответствует действительности. Подскажите по сабжу плиз. Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2020, 15:59 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
Попробуй на время в конце вставить вызов GC.Collect(). Если ситуация не изменится, то тогда у тебя где-то действительно проблемы с утечкой. А если будет освобождаться, то, утечки на самом деле нет, и копать можно только в сторону какой-нибудь оптимизации. По поводу оптимизации, поищи в интернете, как в ASP.NET паковать архив на лету сразу в HttpResponse без временного хранения в памяти - про это есть статьи, я точно помню, потому что года полтора назад у самого была такая задача. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2020, 16:53 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
vb_sub, Нельзя так работать с мультипартом. Сбросьте всё на диск во временную папку как можно быстрее. Затем работайте с файлами из папки. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 01:09 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
vb_sub, Плюс, зипуйте также сразу на диск в режиме потока. Пострайтесь избегать использование памяти. Не используйте MemoryStream, чтобы потом не жаловаться на утечки памяти :) Если всё же приходится, лучше переиспользовать память, для этого есть решения -- легко гуглятся. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 01:10 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
hVostt, что конкретно у меня неправильного в операциях с мультипартом? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 15:42 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
vb_sub hVostt, что конкретно у меня неправильного в операциях с мультипартом? Посмотрите сюда: https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1#upload-large-files-with-streaming-1 и конечно же, не используйте MemoryStream ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 17:02 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
Получилось все сделать без утечек и с минимальной нагрузкой на память-1 вызов метода контроллера для файла 460мб занимает 0,5 мб, потом освобождется. Всем спасибо за участие. Код: c# 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. 39. 40. 41. 42. 43.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 13:37 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
hVostt vb_sub hVostt, что конкретно у меня неправильного в операциях с мультипартом? Посмотрите сюда: https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1#upload-large-files-with-streaming-1 и конечно же, не используйте MemoryStream К сожалению браузерные http-клиенты типа Axios не могут стримить файлы. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 13:39 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
vb_sub К сожалению браузерные http-клиенты типа Axios не могут стримить файлы. При чем тут клиент? У тебя body и запросов и ответов всегда доступно как stream - вот и надо работать с ним напрямую, а не загружать все в память. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 14:29 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
vb_sub Код: c# 1. 2. 3. 4.
А какой в этом смысл? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 16:15 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
hVostt vb_sub Код: c# 1. 2. 3. 4.
А какой в этом смысл? :) Это широко здесь не любимая обертка для http-ответов, но очень удобная Код: c# 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. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 16:23 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
vb_sub Это широко здесь не любимая обертка для http-ответов, но очень удобная Да пофиг на обёртку. Вы каждом действии контроллера делаете catch(...) ? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 16:28 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
vb_sub, гляньте сюда https://docs.microsoft.com/ru-ru/aspnet/core/fundamentals/error-handling?view=aspnetcore-3.1#exception-handler-lambda ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 16:29 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
hVostt, спасибо за ссылку, давно думал сделать базовый контроллер типа Код: c# 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.
но никак не мог собраться протестировать не просядет ли перфоманс из-за делегатов, но вариант по ссылке хорош. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 16:47 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
hVostt vb_sub Это широко здесь не любимая обертка для http-ответов, но очень удобная Да пофиг на обёртку. Вы каждом действии контроллера делаете catch(...) ? :) Да, до Вашей ссылке так и делал. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 16:49 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
вроде как в серверном профайле управления памятью GC предполагается, что память выделяет и не освобождается немедленно, так как вероятнее всего будет скоро снова востребована . То есть памяти программе может быть выделено куча, а использовано c гулькин нос. А так как вы используйте MemoryStream, который скорее всего попадет в ЛоХ, то когда эта память освободится одному богу известно. Почему нельзя сразу писать поток в файл по месту назначения? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:08 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
Roman Mejtes, со второго раза так и сделал-все получилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:11 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
hVostt ASP.NET и так заворачивает весь pipeline в try-catch, превращающий любой непойманый exception в http status 500. Начиная с версии 3 для Api-контроллеров стал к тому же нормально работать UseDeveloperExceptionPage, возвращая красивый JSON с информацией по исключению. До этого он выплевывал в response HTML, который во всяких dev-tools и postman было неудобно читать. Я в те времена использовал всегда свой кастомный фильтр для этого - где-то на гитхабе до сих пор лежит. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:39 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
fkthat ASP.NET и так заворачивает весь pipeline в try-catch, превращающий любой непойманый exception в http status 500. Начиная с версии 3 для Api-контроллеров стал к тому же нормально работать UseDeveloperExceptionPage, возвращая красивый JSON с информацией по исключению. До этого он выплевывал в response HTML, который во всяких dev-tools и postman было неудобно читать. Я в те времена использовал всегда свой кастомный фильтр для этого - где-то на гитхабе до сих пор лежит. Ну да, об этом и говорю. Однако у ТС свой способ обработки исключений, по ссылке как раз примерчик, как это реализовать. Также можно ещё фильтр на контроллер сделать, что скорее всего будет более корректным решением. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 09:08 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
hVostt у ТС свой способ обработки исключений И на*я зачем? Чтобы другим (особенно новому человеку) по полдня потом долбаться, разбираясь, почему, например, вместо 500 возвращается 200, или почему стектрейс исключения в консоли/логах не виден? Задрали же уже все эти изобретения ИТ-самоделкиных. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 09:39 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
fkthat hVostt у ТС свой способ обработки исключений И на*я зачем? Чтобы другим (особенно новому человеку) по полдня потом долбаться, разбираясь, почему, например, вместо 500 возвращается 200, или почему стектрейс исключения в консоли/логах не виден? Задрали же уже все эти изобретения ИТ-самоделкиных. Нужно возвращать соответствующий статускод http-запроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 10:45 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
vb_sub Нужно возвращать соответствующий статускод http-запроса? И какой же статускод вернется после такого: автор Код: c# 1. 2. 3. 4.
Про "потерянный" стектрейс и прочее я уже даже и не говорю. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 12:35 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
fkthat, статус код всегда 200 и в случае успеха и в случае ошибки. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 14:43 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
vb_sub fkthat, статус код всегда 200 и в случае успеха и в случае ошибки. Ok. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 14:53 |
|
Память не освобождается
|
|||
---|---|---|---|
#18+
fkthat hVostt у ТС свой способ обработки исключений И на*я зачем? Чтобы другим (особенно новому человеку) по полдня потом долбаться, разбираясь, почему, например, вместо 500 возвращается 200, или почему стектрейс исключения в консоли/логах не виден? Задрали же уже все эти изобретения ИТ-самоделкиных. Ну хз, чтоб потом его админы материли наверное :) И те, кто будут сопровождать дальше код. Ну нравится так человеку, что поделаешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 20:11 |
|
|
start [/forum/topic.php?fid=18&fpage=5&tid=1354602]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 278ms |
total: | 420ms |
0 / 0 |