Memory leaking when using RediSearch and lots of updates

We have a dataset of roughly 200k documents that are frequently updated.
On average there are ~300 document updates per second (and very rare inserts).

After inserting all 200k documents into empty Redis, total memory usage is ~400MB.
Then it just starts infinitely growing.

The CPU usage also grows over time as well as FT.SEARCH latency. (The system doesn’t allow me to attach more screenshots)

FT.INFO results (after the start & ~3 hours later):
Number of docs: 203463 (max 425517) | Number of records: 5659112 | Number of terms: 80659
Number of docs: 203503 (max 1064325) | Number of records: 5567962 | Number of terms: 80670

We are using the following Redis & RediSearch configuration:

25:S 12 Apr 2022 21:43:51.469 * <search> Redis version found by RedisSearch : 6.2.4 - oss
25:S 12 Apr 2022 21:43:51.469 * <search> RediSearch version 2.0.15 (Git=v2.0.9-85-g41b8baa)
25:S 12 Apr 2022 21:43:51.469 * <search> Low level api version 1 initialized successfully
25:S 12 Apr 2022 21:43:51.469 * <search> concurrent writes: OFF, gc: ON, prefix min length: 2, prefix max expansions: 200, query timeout (ms): 500, timeout policy: return, cursor read size: 1000, cursor max idle (ms): 300000, max doctable size: 250000, max number of search results:  1000000, search pool size: 20, index pool size: 8, 

We have a sentinel cluster with one master instance & 2 read-only replicas.

Hi Bashalex,
Please change flag FORK_GC_CLEAN_NUMERIC_EMPTY_NODES to TRUE.
Cheers,
Ariel

Thanks for the reply!

I’ll try that flag & report back.
Is there any available documentation on what exactly the flag does?

I did enable the flag, but unfortunately the memory seems to be growing at the same pace:

@bashalex can you please post full FT.INFO reply for the index?
Also, did you try v2.2.10?

Is there anything particular about the 2.2.10 version that might help?
I see the latest version available is 2.4.3 – would it make sense to update straight to it?


UPD: updated to 2.2.10 – memory is still leaking

2.4.3 is not GA yet.
Can you post your full ft.info stats?

I did post the stats, but apparently my post was automatically deleted and should be approved by some stuff member to be returned.

I’ll try to post again though.

Here go the stats after 3 days of running the application with the following configuration.
MAXDOCTABLESIZE: "250000"
FORK_GC_RUN_INTERVAL: "1"
FORK_GC_CLEAN_NUMERIC_EMPTY_NODES: "true"

127.0.0.1:6379> FT.INFO index_v4
 1) index_name
 2) index_v4
 3) index_options
 4) 1) "NOFREQS"
 5) index_definition
 6) 1) key_type
    2) HASH
    3) prefixes
    4) 1) asset:
    5) default_score
    6) "1"
 7) attributes
 8)   1) 1) identifier
         2) name
         3) attribute
         4) name
         5) type
         6) TEXT
         7) WEIGHT
         8) "1"
         9) NOSTEM
      2) 1) identifier
         2) name_root
         3) attribute
         4) name_root
         5) type
         6) TAG
         7) SEPARATOR
         8) ,
      3) 1) identifier
         2) name_root_length
         3) attribute
         4) name_root_length
         5) type
         6) NUMERIC
      4) 1) identifier
         2) name_fragments
         3) attribute
         4) name_fragments
         5) type
         6) TAG
         7) SEPARATOR
         8) ,
      5) 1) identifier
         2) symbol
         3) attribute
         4) symbol
         5) type
         6) TAG
         7) SEPARATOR
         8) ,
      6) 1) identifier
         2) symbol_length
         3) attribute
         4) symbol_length
         5) type
         6) NUMERIC
      7) 1) identifier
         2) chains
         3) attribute
         4) chains
         5) type
         6) TAG
         7) SEPARATOR
         8) ,
      8) 1) identifier
         2) addresses
         3) attribute
         4) addresses
         5) type
         6) TAG
         7) SEPARATOR
         8) ,
      9) 1) identifier
         2) type
         3) attribute
         4) type
         5) type
         6) TAG
         7) SEPARATOR
         8) ,
     10) 1) identifier
         2) tags
         3) attribute
         4) tags
         5) type
         6) TAG
         7) SEPARATOR
         8) ,
     11) 1) identifier
         2) verified
         3) attribute
         4) verified
         5) type
         6) NUMERIC
     12) 1) identifier
         2) market_cap_usd
         3) attribute
         4) market_cap_usd
         5) type
         6) NUMERIC
         7) SORTABLE
     13) 1) identifier
         2) updated_at
         3) attribute
         4) updated_at
         5) type
         6) NUMERIC
         7) SORTABLE
     14) 1) identifier
         2) price_eth
         3) attribute
         4) price_eth
         5) type
         6) NUMERIC
         7) SORTABLE
     15) 1) identifier
         2) relative_price_change_eth_0d
         3) attribute
         4) relative_price_change_eth_0d
         5) type
         6) NUMERIC
         7) SORTABLE
     16) 1) identifier
         2) relative_price_change_eth_1d
         3) attribute
         4) relative_price_change_eth_1d
         5) type
         6) NUMERIC
         7) SORTABLE
     17) 1) identifier
         2) relative_price_change_eth_30d
         3) attribute
         4) relative_price_change_eth_30d
         5) type
         6) NUMERIC
         7) SORTABLE
     18) 1) identifier
         2) relative_price_change_eth_90d
         3) attribute
         4) relative_price_change_eth_90d
         5) type
         6) NUMERIC
         7) SORTABLE
     19) 1) identifier
         2) relative_price_change_eth_365d
         3) attribute
         4) relative_price_change_eth_365d
         5) type
         6) NUMERIC
         7) SORTABLE
     20) 1) identifier
         2) price_btc
         3) attribute
         4) price_btc
         5) type
         6) NUMERIC
         7) SORTABLE
     21) 1) identifier
         2) relative_price_change_btc_0d
         3) attribute
         4) relative_price_change_btc_0d
         5) type
         6) NUMERIC
         7) SORTABLE
     22) 1) identifier
         2) relative_price_change_btc_1d
         3) attribute
         4) relative_price_change_btc_1d
         5) type
         6) NUMERIC
         7) SORTABLE
     23) 1) identifier
         2) relative_price_change_btc_30d
         3) attribute
         4) relative_price_change_btc_30d
         5) type
         6) NUMERIC
         7) SORTABLE
     24) 1) identifier
         2) relative_price_change_btc_90d
         3) attribute
         4) relative_price_change_btc_90d
         5) type
         6) NUMERIC
         7) SORTABLE
     25) 1) identifier
         2) relative_price_change_btc_365d
         3) attribute
         4) relative_price_change_btc_365d
         5) type
         6) NUMERIC
         7) SORTABLE
     26) 1) identifier
         2) price_usd
         3) attribute
         4) price_usd
         5) type
         6) NUMERIC
         7) SORTABLE
     27) 1) identifier
         2) relative_price_change_usd_0d
         3) attribute
         4) relative_price_change_usd_0d
         5) type
         6) NUMERIC
         7) SORTABLE
     28) 1) identifier
         2) relative_price_change_usd_1d
         3) attribute
         4) relative_price_change_usd_1d
         5) type
         6) NUMERIC
         7) SORTABLE
     29) 1) identifier
         2) relative_price_change_usd_30d
         3) attribute
         4) relative_price_change_usd_30d
         5) type
         6) NUMERIC
         7) SORTABLE
     30) 1) identifier
         2) relative_price_change_usd_90d
         3) attribute
         4) relative_price_change_usd_90d
         5) type
         6) NUMERIC
         7) SORTABLE
     31) 1) identifier
         2) relative_price_change_usd_365d
         3) attribute
         4) relative_price_change_usd_365d
         5) type
         6) NUMERIC
         7) SORTABLE
     32) 1) identifier
         2) price_eur
         3) attribute
         4) price_eur
         5) type
         6) NUMERIC
         7) SORTABLE
     33) 1) identifier
         2) relative_price_change_eur_0d
         3) attribute
         4) relative_price_change_eur_0d
         5) type
         6) NUMERIC
         7) SORTABLE
     34) 1) identifier
         2) relative_price_change_eur_1d
         3) attribute
         4) relative_price_change_eur_1d
         5) type
         6) NUMERIC
         7) SORTABLE
     35) 1) identifier
         2) relative_price_change_eur_30d
         3) attribute
         4) relative_price_change_eur_30d
         5) type
         6) NUMERIC
         7) SORTABLE
     36) 1) identifier
         2) relative_price_change_eur_90d
         3) attribute
         4) relative_price_change_eur_90d
         5) type
         6) NUMERIC
         7) SORTABLE
     37) 1) identifier
         2) relative_price_change_eur_365d
         3) attribute
         4) relative_price_change_eur_365d
         5) type
         6) NUMERIC
         7) SORTABLE
     38) 1) identifier
         2) price_krw
         3) attribute
         4) price_krw
         5) type
         6) NUMERIC
         7) SORTABLE
     39) 1) identifier
         2) relative_price_change_krw_0d
         3) attribute
         4) relative_price_change_krw_0d
         5) type
         6) NUMERIC
         7) SORTABLE
     40) 1) identifier
         2) relative_price_change_krw_1d
         3) attribute
         4) relative_price_change_krw_1d
         5) type
         6) NUMERIC
         7) SORTABLE
     41) 1) identifier
         2) relative_price_change_krw_30d
         3) attribute
         4) relative_price_change_krw_30d
         5) type
         6) NUMERIC
         7) SORTABLE
     42) 1) identifier
         2) relative_price_change_krw_90d
         3) attribute
         4) relative_price_change_krw_90d
         5) type
         6) NUMERIC
         7) SORTABLE
     43) 1) identifier
         2) relative_price_change_krw_365d
         3) attribute
         4) relative_price_change_krw_365d
         5) type
         6) NUMERIC
         7) SORTABLE
     44) 1) identifier
         2) price_rub
         3) attribute
         4) price_rub
         5) type
         6) NUMERIC
         7) SORTABLE
     45) 1) identifier
         2) relative_price_change_rub_0d
         3) attribute
         4) relative_price_change_rub_0d
         5) type
         6) NUMERIC
         7) SORTABLE
     46) 1) identifier
         2) relative_price_change_rub_1d
         3) attribute
         4) relative_price_change_rub_1d
         5) type
         6) NUMERIC
         7) SORTABLE
     47) 1) identifier
         2) relative_price_change_rub_30d
         3) attribute
         4) relative_price_change_rub_30d
         5) type
         6) NUMERIC
         7) SORTABLE
     48) 1) identifier
         2) relative_price_change_rub_90d
         3) attribute
         4) relative_price_change_rub_90d
         5) type
         6) NUMERIC
         7) SORTABLE
     49) 1) identifier
         2) relative_price_change_rub_365d
         3) attribute
         4) relative_price_change_rub_365d
         5) type
         6) NUMERIC
         7) SORTABLE
     50) 1) identifier
         2) price_gbp
         3) attribute
         4) price_gbp
         5) type
         6) NUMERIC
         7) SORTABLE
     51) 1) identifier
         2) relative_price_change_gbp_0d
         3) attribute
         4) relative_price_change_gbp_0d
         5) type
         6) NUMERIC
         7) SORTABLE
     52) 1) identifier
         2) relative_price_change_gbp_1d
         3) attribute
         4) relative_price_change_gbp_1d
         5) type
         6) NUMERIC
         7) SORTABLE
     53) 1) identifier
         2) relative_price_change_gbp_30d
         3) attribute
         4) relative_price_change_gbp_30d
         5) type
         6) NUMERIC
         7) SORTABLE
     54) 1) identifier
         2) relative_price_change_gbp_90d
         3) attribute
         4) relative_price_change_gbp_90d
         5) type
         6) NUMERIC
         7) SORTABLE
     55) 1) identifier
         2) relative_price_change_gbp_365d
         3) attribute
         4) relative_price_change_gbp_365d
         5) type
         6) NUMERIC
         7) SORTABLE
     56) 1) identifier
         2) price_aud
         3) attribute
         4) price_aud
         5) type
         6) NUMERIC
         7) SORTABLE
     57) 1) identifier
         2) relative_price_change_aud_0d
         3) attribute
         4) relative_price_change_aud_0d
         5) type
         6) NUMERIC
         7) SORTABLE
     58) 1) identifier
         2) relative_price_change_aud_1d
         3) attribute
         4) relative_price_change_aud_1d
         5) type
         6) NUMERIC
         7) SORTABLE
     59) 1) identifier
         2) relative_price_change_aud_30d
         3) attribute
         4) relative_price_change_aud_30d
         5) type
         6) NUMERIC
         7) SORTABLE
     60) 1) identifier
         2) relative_price_change_aud_90d
         3) attribute
         4) relative_price_change_aud_90d
         5) type
         6) NUMERIC
         7) SORTABLE
     61) 1) identifier
         2) relative_price_change_aud_365d
         3) attribute
         4) relative_price_change_aud_365d
         5) type
         6) NUMERIC
         7) SORTABLE
     62) 1) identifier
         2) price_cad
         3) attribute
         4) price_cad
         5) type
         6) NUMERIC
         7) SORTABLE
     63) 1) identifier
         2) relative_price_change_cad_0d
         3) attribute
         4) relative_price_change_cad_0d
         5) type
         6) NUMERIC
         7) SORTABLE
     64) 1) identifier
         2) relative_price_change_cad_1d
         3) attribute
         4) relative_price_change_cad_1d
         5) type
         6) NUMERIC
         7) SORTABLE
     65) 1) identifier
         2) relative_price_change_cad_30d
         3) attribute
         4) relative_price_change_cad_30d
         5) type
         6) NUMERIC
         7) SORTABLE
     66) 1) identifier
         2) relative_price_change_cad_90d
         3) attribute
         4) relative_price_change_cad_90d
         5) type
         6) NUMERIC
         7) SORTABLE
     67) 1) identifier
         2) relative_price_change_cad_365d
         3) attribute
         4) relative_price_change_cad_365d
         5) type
         6) NUMERIC
         7) SORTABLE
     68) 1) identifier
         2) price_inr
         3) attribute
         4) price_inr
         5) type
         6) NUMERIC
         7) SORTABLE
     69) 1) identifier
         2) relative_price_change_inr_0d
         3) attribute
         4) relative_price_change_inr_0d
         5) type
         6) NUMERIC
         7) SORTABLE
     70) 1) identifier
         2) relative_price_change_inr_1d
         3) attribute
         4) relative_price_change_inr_1d
         5) type
         6) NUMERIC
         7) SORTABLE
     71) 1) identifier
         2) relative_price_change_inr_30d
         3) attribute
         4) relative_price_change_inr_30d
         5) type
         6) NUMERIC
         7) SORTABLE
     72) 1) identifier
         2) relative_price_change_inr_90d
         3) attribute
         4) relative_price_change_inr_90d
         5) type
         6) NUMERIC
         7) SORTABLE
     73) 1) identifier
         2) relative_price_change_inr_365d
         3) attribute
         4) relative_price_change_inr_365d
         5) type
         6) NUMERIC
         7) SORTABLE
     74) 1) identifier
         2) price_jpy
         3) attribute
         4) price_jpy
         5) type
         6) NUMERIC
         7) SORTABLE
     75) 1) identifier
         2) relative_price_change_jpy_0d
         3) attribute
         4) relative_price_change_jpy_0d
         5) type
         6) NUMERIC
         7) SORTABLE
     76) 1) identifier
         2) relative_price_change_jpy_1d
         3) attribute
         4) relative_price_change_jpy_1d
         5) type
         6) NUMERIC
         7) SORTABLE
     77) 1) identifier
         2) relative_price_change_jpy_30d
         3) attribute
         4) relative_price_change_jpy_30d
         5) type
         6) NUMERIC
         7) SORTABLE
     78) 1) identifier
         2) relative_price_change_jpy_90d
         3) attribute
         4) relative_price_change_jpy_90d
         5) type
         6) NUMERIC
         7) SORTABLE
     79) 1) identifier
         2) relative_price_change_jpy_365d
         3) attribute
         4) relative_price_change_jpy_365d
         5) type
         6) NUMERIC
         7) SORTABLE
     80) 1) identifier
         2) price_nzd
         3) attribute
         4) price_nzd
         5) type
         6) NUMERIC
         7) SORTABLE
     81) 1) identifier
         2) relative_price_change_nzd_0d
         3) attribute
         4) relative_price_change_nzd_0d
         5) type
         6) NUMERIC
         7) SORTABLE
     82) 1) identifier
         2) relative_price_change_nzd_1d
         3) attribute
         4) relative_price_change_nzd_1d
         5) type
         6) NUMERIC
         7) SORTABLE
     83) 1) identifier
         2) relative_price_change_nzd_30d
         3) attribute
         4) relative_price_change_nzd_30d
         5) type
         6) NUMERIC
         7) SORTABLE
     84) 1) identifier
         2) relative_price_change_nzd_90d
         3) attribute
         4) relative_price_change_nzd_90d
         5) type
         6) NUMERIC
         7) SORTABLE
     85) 1) identifier
         2) relative_price_change_nzd_365d
         3) attribute
         4) relative_price_change_nzd_365d
         5) type
         6) NUMERIC
         7) SORTABLE
     86) 1) identifier
         2) price_try
         3) attribute
         4) price_try
         5) type
         6) NUMERIC
         7) SORTABLE
     87) 1) identifier
         2) relative_price_change_try_0d
         3) attribute
         4) relative_price_change_try_0d
         5) type
         6) NUMERIC
         7) SORTABLE
     88) 1) identifier
         2) relative_price_change_try_1d
         3) attribute
         4) relative_price_change_try_1d
         5) type
         6) NUMERIC
         7) SORTABLE
     89) 1) identifier
         2) relative_price_change_try_30d
         3) attribute
         4) relative_price_change_try_30d
         5) type
         6) NUMERIC
         7) SORTABLE
     90) 1) identifier
         2) relative_price_change_try_90d
         3) attribute
         4) relative_price_change_try_90d
         5) type
         6) NUMERIC
         7) SORTABLE
     91) 1) identifier
         2) relative_price_change_try_365d
         3) attribute
         4) relative_price_change_try_365d
         5) type
         6) NUMERIC
         7) SORTABLE
     92) 1) identifier
         2) price_zar
         3) attribute
         4) price_zar
         5) type
         6) NUMERIC
         7) SORTABLE
     93) 1) identifier
         2) relative_price_change_zar_0d
         3) attribute
         4) relative_price_change_zar_0d
         5) type
         6) NUMERIC
         7) SORTABLE
     94) 1) identifier
         2) relative_price_change_zar_1d
         3) attribute
         4) relative_price_change_zar_1d
         5) type
         6) NUMERIC
         7) SORTABLE
     95) 1) identifier
         2) relative_price_change_zar_30d
         3) attribute
         4) relative_price_change_zar_30d
         5) type
         6) NUMERIC
         7) SORTABLE
     96) 1) identifier
         2) relative_price_change_zar_90d
         3) attribute
         4) relative_price_change_zar_90d
         5) type
         6) NUMERIC
         7) SORTABLE
     97) 1) identifier
         2) relative_price_change_zar_365d
         3) attribute
         4) relative_price_change_zar_365d
         5) type
         6) NUMERIC
         7) SORTABLE
     98) 1) identifier
         2) price_cny
         3) attribute
         4) price_cny
         5) type
         6) NUMERIC
         7) SORTABLE
     99) 1) identifier
         2) relative_price_change_cny_0d
         3) attribute
         4) relative_price_change_cny_0d
         5) type
         6) NUMERIC
         7) SORTABLE
    100) 1) identifier
         2) relative_price_change_cny_1d
         3) attribute
         4) relative_price_change_cny_1d
         5) type
         6) NUMERIC
         7) SORTABLE
    101) 1) identifier
         2) relative_price_change_cny_30d
         3) attribute
         4) relative_price_change_cny_30d
         5) type
         6) NUMERIC
         7) SORTABLE
    102) 1) identifier
         2) relative_price_change_cny_90d
         3) attribute
         4) relative_price_change_cny_90d
         5) type
         6) NUMERIC
         7) SORTABLE
    103) 1) identifier
         2) relative_price_change_cny_365d
         3) attribute
         4) relative_price_change_cny_365d
         5) type
         6) NUMERIC
         7) SORTABLE
    104) 1) identifier
         2) price_chf
         3) attribute
         4) price_chf
         5) type
         6) NUMERIC
         7) SORTABLE
    105) 1) identifier
         2) relative_price_change_chf_0d
         3) attribute
         4) relative_price_change_chf_0d
         5) type
         6) NUMERIC
         7) SORTABLE
    106) 1) identifier
         2) relative_price_change_chf_1d
         3) attribute
         4) relative_price_change_chf_1d
         5) type
         6) NUMERIC
         7) SORTABLE
    107) 1) identifier
         2) relative_price_change_chf_30d
         3) attribute
         4) relative_price_change_chf_30d
         5) type
         6) NUMERIC
         7) SORTABLE
    108) 1) identifier
         2) relative_price_change_chf_90d
         3) attribute
         4) relative_price_change_chf_90d
         5) type
         6) NUMERIC
         7) SORTABLE
    109) 1) identifier
         2) relative_price_change_chf_365d
         3) attribute
         4) relative_price_change_chf_365d
         5) type
         6) NUMERIC
         7) SORTABLE
 9) num_docs
10) "205910"
11) max_doc_id
12) "19989068"
13) num_terms
14) "81299"
15) num_records
16) "1.844674407369898e+19"
17) inverted_sz_mb
18) "43.430500030517578"
19) total_inverted_index_blocks
20) "4460371"
21) offset_vectors_sz_mb
22) "67.800628662109375"
23) doc_table_size_mb
24) "25.689956665039062"
25) sortable_values_size_mb
26) "55.919036865234375"
27) key_table_size_mb
28) "7.8203334808349609"
29) records_per_doc_avg
30) "89586441125888"
31) bytes_per_record_avg
32) "2.468738104569046e-12"
33) offsets_per_term_avg
34) "3.8540169319811746e-12"
35) offset_bits_per_record_avg
36) "8.0000057220458984"
37) hash_indexing_failures
38) "0"
39) indexing
40) "0"
41) percent_indexed
42) "1"
43) gc_stats
44)  1) bytes_collected
     2) "15493862083"
     3) total_ms_run
     4) "124121986"
     5) total_cycles
     6) "69558"
     7) average_cycle_time_ms
     8) "1784.4386842634924"
     9) last_run_time_ms
    10) "2438"
    11) gc_numeric_trees_missed
    12) "27524"
    13) gc_blocks_denied
    14) "100667976"
45) cursor_stats
46) 1) global_idle
    2) (integer) 0
    3) global_total
    4) (integer) 0
    5) index_capacity
    6) (integer) 128
    7) index_total
    8) (integer) 0
47) stopwords_list
48) (empty array)

I can see you have many numeric indexes which are demanding when it comes to indexing and clearing.
Can you let the system sit still for a few minutes and see if the memory drops?
Since the memory cleanup runs on a fork, any chance to the structure will make the GC skip some nodes.
Allowing the system to run GC with no updates in parallel could give the system a chance to run a full cycle.