у Clickhouse есть проблема с утечкой памяти? - PullRequest
0 голосов
/ 21 июня 2020

Я установил сервер clickhouse на контейнере proxmox с CentOS 7, а версия clickhouse - 20. Я даю контейнеру 60 ГБ ОЗУ и сделал настройку clickhouse для ограничения памяти на 30 ГБ. Я использовал clickhouse_sqlalchemy python для подключения к нему на другом компьютере. Когда я начинаю задавать ему какой-то жесткий запрос, я замечаю, что он начал генерировать некоторые исключения памяти.

Ниже я пару раз выполнил запрос агрегирования. Он отлично работает сначала 6 раз, а затем начал генерировать исключение памяти. Мне кажется, что сервер clickhouse не освобождает память после выполнения моего запроса:

from sqlalchemy import create_engine, Column, MetaData, literal
from clickhouse_sqlalchemy import Table, make_session, get_declarative_base, types, engines
import pandas as pd
import numpy as np

uri = 'clickhouse://default@192.168.10.9/'
engine = create_engine(uri)
metadata = MetaData()

sql = """
SELECT toYYYYMMDD(trade_datetime) AS trade_dt, s_info_windcode, SUM(volume) AS volume FROM minute_bar
WHERE toInt64(toYYYYMMDDhhmmss(trade_datetime)) - toInt64(toYYYYMMDD(trade_datetime)) * 1000000 > 94500
AND toInt64(toYYYYMMDDhhmmss(trade_datetime)) - toInt64(toYYYYMMDD(trade_datetime)) * 1000000 < 141500
GROUP BY toYYYYMMDD(trade_datetime), s_info_windcode"""

for i in range(10):
    res = engine.execute(sql)
    data = res.fetchall()
    print(i, data[0])

ниже приведены результаты:

0 ('20191025', '603915.SH', '2157700')
1 ('20130208', '002059.SZ', '1159964')
2 ('20191025', '603915.SH', '2157700')
3 ('20130208', '002059.SZ', '1159964')
4 ('20130208', '002059.SZ', '1159964')
5 ('20191025', '603915.SH', '2157700')
---------------------------------------------------------------------------
DatabaseException                         Traceback (most recent call last)
<ipython-input-2-d1cd821b006b> in <module>
      7 
      8 for i in range(10):
----> 9     res = engine.execute(sql)
     10     data = res.fetchall()
     11     print(i, data[0])

/opt/conda/lib/python3.7/site-packages/sqlalchemy/engine/base.py in execute(self, statement, *multiparams, **params)
   2242 
   2243         connection = self._contextual_connect(close_with_result=True)
-> 2244         return connection.execute(statement, *multiparams, **params)
   2245 
   2246     def scalar(self, statement, *multiparams, **params):

/opt/conda/lib/python3.7/site-packages/sqlalchemy/engine/base.py in execute(self, object_, *multiparams, **params)
   1010         """
   1011         if isinstance(object_, util.string_types[0]):
-> 1012             return self._execute_text(object_, multiparams, params)
   1013         try:
   1014             meth = object_._execute_on_connection

/opt/conda/lib/python3.7/site-packages/sqlalchemy/engine/base.py in _execute_text(self, statement, multiparams, params)
   1185             parameters,
   1186             statement,
-> 1187             parameters,
   1188         )
   1189         if self._has_events or self.engine._has_events:

/opt/conda/lib/python3.7/site-packages/sqlalchemy/engine/base.py in _execute_context(self, dialect, constructor, statement, parameters, *args)
   1322         except BaseException as e:
   1323             self._handle_dbapi_exception(
-> 1324                 e, statement, parameters, cursor, context
   1325             )
   1326 

/opt/conda/lib/python3.7/site-packages/sqlalchemy/engine/base.py in _handle_dbapi_exception(self, e, statement, parameters, cursor, context)
   1519                 )
   1520             else:
-> 1521                 util.raise_(exc_info[1], with_traceback=exc_info[2])
   1522 
   1523         finally:

/opt/conda/lib/python3.7/site-packages/sqlalchemy/util/compat.py in raise_(***failed resolving arguments***)
    176 
    177         try:
--> 178             raise exception
    179         finally:
    180             # credit to

/opt/conda/lib/python3.7/site-packages/sqlalchemy/engine/base.py in _execute_context(self, dialect, constructor, statement, parameters, *args)
   1282                 if not evt_handled:
   1283                     self.dialect.do_execute(
-> 1284                         cursor, statement, parameters, context
   1285                     )
   1286 

/opt/conda/lib/python3.7/site-packages/clickhouse_sqlalchemy/drivers/base.py in do_execute(self, cursor, statement, parameters, context)
    874 
    875     def do_execute(self, cursor, statement, parameters, context=None):
--> 876         cursor.execute(statement, parameters, context=context)
    877 
    878     def _check_unicode_returns(self, connection, additional_tests=None):

/opt/conda/lib/python3.7/site-packages/clickhouse_sqlalchemy/drivers/http/connector.py in execute(self, operation, parameters, context)
    115         response_gen = transport.execute(raw_sql, params=params)
    116 
--> 117         self._process_response(response_gen)
    118         self._end_query()
    119 

/opt/conda/lib/python3.7/site-packages/clickhouse_sqlalchemy/drivers/http/connector.py in _process_response(self, response)
    214         response = iter(response)
    215 
--> 216         self._columns = next(response, None)
    217         self._types = next(response, None)
    218         self._response = response

/opt/conda/lib/python3.7/site-packages/clickhouse_sqlalchemy/drivers/http/transport.py in execute(self, query, params)
     89         there is nothing to return.
     90         """
---> 91         r = self._send(query, params=params, stream=True)
     92         lines = r.iter_lines()
     93         try:

/opt/conda/lib/python3.7/site-packages/clickhouse_sqlalchemy/drivers/http/transport.py in _send(self, data, params, stream)
    135             orig = HTTPException(r.text)
    136             orig.code = r.status_code
--> 137             raise DatabaseException(orig)
    138         return r

DatabaseException: Orig exception: Code: 241, e.displayText() = DB::Exception: Memory limit (total) exceeded: would use 52.74 GiB (attempt to allocate chunk of 4718592 bytes), maximum: 52.73 GiB: While executing AggregatingTransform (version 20.4.5.36 (official build))

Это похоже на проблему с утечкой памяти, это правда?

ОБНОВЛЕНО: журнал clickhouse:

0. Poco::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x103fa390 in /usr/bin/clickhouse
1. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x900b8ad in /usr/bin/clickhouse
2. ? @ 0x900af73 in /usr/bin/clickhouse
3. MemoryTracker::alloc(long) @ 0x90095e7 in /usr/bin/clickhouse
4. MemoryTracker::alloc(long) @ 0x90095e7 in /usr/bin/clickhouse
5. MemoryTracker::alloc(long) @ 0x90095e7 in /usr/bin/clickhouse
6. void DB::PODArrayBase<8ul, 4096ul, Allocator<false, false>, 15ul, 16ul>::resize<>(unsigned long) @ 0x927b568 in /usr/bin/clickhouse
7. ? @ 0x99572db in /usr/bin/clickhouse
8. ? @ 0x995efa1 in /usr/bin/clickhouse
9. DB::FunctionBinaryArithmetic<DB::MultiplyImpl, DB::NameMultiply, true>::executeImpl(DB::Block&, std::__1::vector<unsigned long, std::__1::allocator<unsigned long> > const&, unsigned long, unsigned long) @ 0x9960f01 in /usr/bin/clickhouse
10. DB::ExecutableFunctionAdaptor::execute(DB::Block&, std::__1::vector<unsigned long, std::__1::allocator<unsigned long> > const&, unsigned long, unsigned long, bool) @ 0x9265781 in /usr/bin/clickhouse
11. DB::ExpressionAction::execute(DB::Block&, bool, std::__1::shared_ptr<DB::ExtraBlock>&) const @ 0xd1c2452 in /usr/bin/clickhouse
12. DB::ExpressionActions::execute(DB::Block&, bool) const @ 0xd1c73f0 in /usr/bin/clickhouse
13. DB::MergeTreeRangeReader::executePrewhereActionsAndFilterColumns(DB::MergeTreeRangeReader::ReadResult&) @ 0xd9b5787 in /usr/bin/clickhouse
14. DB::MergeTreeRangeReader::read(unsigned long, std::__1::deque<DB::MarkRange, std::__1::allocator<DB::MarkRange> >&) @ 0xd9b6344 in /usr/bin/clickhouse
15. DB::MergeTreeRangeReader::read(unsigned long, std::__1::deque<DB::MarkRange, std::__1::allocator<DB::MarkRange> >&) @ 0xd9b6057 in /usr/bin/clickhouse
16. DB::MergeTreeBaseSelectProcessor::readFromPartImpl() @ 0xd9af83d in /usr/bin/clickhouse
17. DB::MergeTreeBaseSelectProcessor::generate() @ 0xd9b0417 in /usr/bin/clickhouse
18. DB::ISource::work() @ 0xdad2fab in /usr/bin/clickhouse
19. DB::SourceWithProgress::work() @ 0xdd18887 in /usr/bin/clickhouse
20. ? @ 0xdafe041 in /usr/bin/clickhouse
21. DB::PipelineExecutor::executeSingleThread(unsigned long, unsigned long) @ 0xdb01ffd in /usr/bin/clickhouse
22. ? @ 0xdb029c4 in /usr/bin/clickhouse
23. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x9031267 in /usr/bin/clickhouse
24. ? @ 0x902f753 in /usr/bin/clickhouse
25. start_thread @ 0x7e65 in /usr/lib64/libpthread-2.17.so
26. clone @ 0xfe88d in /usr/lib64/libc-2.17.so

2020.06.21 08:14:58.132139 [ 481 ] {} <Error> DynamicQueryHandler: Code: 241, e.displayText() = DB::Exception: Memory limit (total) exceeded: would use 52.74 GiB (attempt to allocate chunk of 4196504 bytes), maximum: 52.73 GiB: While executing MergeTreeThread, Stack trace (when copying this message, always include the lines below):

0. Poco::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x103fa390 in /usr/bin/clickhouse
1. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) @ 0x900b8ad in /usr/bin/clickhouse
2. ? @ 0x900af73 in /usr/bin/clickhouse
3. MemoryTracker::alloc(long) @ 0x90095e7 in /usr/bin/clickhouse
4. MemoryTracker::alloc(long) @ 0x90095e7 in /usr/bin/clickhouse
5. MemoryTracker::alloc(long) @ 0x90095e7 in /usr/bin/clickhouse
6. void DB::PODArrayBase<8ul, 4096ul, Allocator<false, false>, 15ul, 16ul>::resize<>(unsigned long) @ 0x927b568 in /usr/bin/clickhouse
7. ? @ 0x99572db in /usr/bin/clickhouse
8. ? @ 0x995efa1 in /usr/bin/clickhouse
9. DB::FunctionBinaryArithmetic<DB::MultiplyImpl, DB::NameMultiply, true>::executeImpl(DB::Block&, std::__1::vector<unsigned long, std::__1::allocator<unsigned long> > const&, unsigned long, unsigned long) @ 0x9960f01 in /usr/bin/clickhouse
10. DB::ExecutableFunctionAdaptor::execute(DB::Block&, std::__1::vector<unsigned long, std::__1::allocator<unsigned long> > const&, unsigned long, unsigned long, bool) @ 0x9265781 in /usr/bin/clickhouse
11. DB::ExpressionAction::execute(DB::Block&, bool, std::__1::shared_ptr<DB::ExtraBlock>&) const @ 0xd1c2452 in /usr/bin/clickhouse
12. DB::ExpressionActions::execute(DB::Block&, bool) const @ 0xd1c73f0 in /usr/bin/clickhouse
13. DB::MergeTreeRangeReader::executePrewhereActionsAndFilterColumns(DB::MergeTreeRangeReader::ReadResult&) @ 0xd9b5787 in /usr/bin/clickhouse
14. DB::MergeTreeRangeReader::read(unsigned long, std::__1::deque<DB::MarkRange, std::__1::allocator<DB::MarkRange> >&) @ 0xd9b6344 in /usr/bin/clickhouse
15. DB::MergeTreeRangeReader::read(unsigned long, std::__1::deque<DB::MarkRange, std::__1::allocator<DB::MarkRange> >&) @ 0xd9b6057 in /usr/bin/clickhouse
16. DB::MergeTreeBaseSelectProcessor::readFromPartImpl() @ 0xd9af83d in /usr/bin/clickhouse
17. DB::MergeTreeBaseSelectProcessor::generate() @ 0xd9b0417 in /usr/bin/clickhouse
18. DB::ISource::work() @ 0xdad2fab in /usr/bin/clickhouse
19. DB::SourceWithProgress::work() @ 0xdd18887 in /usr/bin/clickhouse
20. ? @ 0xdafe041 in /usr/bin/clickhouse
21. DB::PipelineExecutor::executeSingleThread(unsigned long, unsigned long) @ 0xdb01ffd in /usr/bin/clickhouse
22. ? @ 0xdb029c4 in /usr/bin/clickhouse
23. ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0x9031267 in /usr/bin/clickhouse
24. ? @ 0x902f753 in /usr/bin/clickhouse
25. start_thread @ 0x7e65 in /usr/lib64/libpthread-2.17.so
26. clone @ 0xfe88d in /usr/lib64/libc-2.17.so
 (version 20.4.5.36 (official build))
...