-
-
Notifications
You must be signed in to change notification settings - Fork 457
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Possible memory leak when using multiple queries on the same page #3507
Comments
Just to clarify before looking into this because that's an important distinction: Does it never come down and stay stuck at 800MB (I assume MB not Mb?) or does it crash? If your server doesn't actually rise in usage and/or crash it's not a leak, so just clarifying here. Also just to point this out, there isn't anything special going on here. If you have just two operations (ie two document + variables combos) then it's more of a question how many concurrent queries are actually run as no memory is retained in the core client, bindings, or exchanges 🤔 |
Yeah sorry I meant MB. I tested it again and when the test was completed memory usage was at ~800MB and then it slightly decreased to ~700MB. No crashes, still works fine at that point when manually checking with browser. Memory usage just stays at ~700MB while I waited for 10 minutes for it to come down. |
Hm, ok gotcha 👍 That doesn't necessarily sound like a memory leak, but a Chrome debugger memory snapshot could show you what's being retained and what's using that memory. Generally, it's possible that a combination of GraphQL result data and Vue app tree data is being retained concurrently. But it's hard to tell how much memory that adds up to. Generally, 800MB could be plausible given that the GC may choose to also not activate an aggressive sweep phase when it still has enough heap space left |
Ok I've now updated the reproduction repo with clearer tests. It wasn't even about using the data from the first query in the second, it leaks with just two awaited queries. With just one query there isn't any leak. Also I added a mock API endpoint under the api routes so that the external service isn't affecting the results. I also set max_old_space_size to 512MB to see if it changed anything. Below are the results from the autocannon tests. I'm not that good at decyphering the snapshots yet so that doesn't help me much. Those memory readings are taken from the Chrome debuggers memory view after each test.
|
Gotcha! That's awesome. I'll have a look at the memory debugger myself this evening. Typically, I'd assume we've created some kind of promise chain or cycle here 🤔 |
Have you had time to check this one out yet? |
I can confirm we have the same issue on our project. Any page/component which has two queries will retain all the setup context of the component in memory and it is never released. For a while I thought it was not an issue with urql as it is not just urql objects like graphcache, queries and data that are retained but also other objects like router object, unhead object etc... Basically anything in the setup function. But if I remove the second query, it always fixes the problem, on all of the pages/components. @kitten Have you had a chance to look at this issue yet ? |
@negezor are you by any chance initializing your |
@JoviDeCroock no. I have a new instance of the application initialized for each request. Including graphcache, otherwise the same data would be sent for each user and it would be a data access violation. |
After investigating further, I seem to have some ideas about why the memory leak is happening. For some reason, the request object, which is not being mutated on my end, has a large number of ReactiveEffect. Apparently, this is happening here. urql/packages/vue-urql/src/useQuery.ts Line 248 in 118d74b
UPD: By applying |
@JoviDeCroock @negezor |
I have consistent memory leak, but I don't know where from. Memory raises from 300MB to 4.5GB (which is maximum of the server itself) and then crashes with OOM error. Waiting for release to test if leak was coming from here. :) |
Confirmed. After upgrading to 1.4.0-canary-068df71f - Now memory stays at ~200MB. Edit: But when deployed on production - memory again grows. Probably I have another memory leak. lol |
Describe the bug
When using two queries on the same page and the other one is awaited and the other one is not and that one is using data from the awaited query, there is a memory leak.
Using the reproduction memory usage climbs from ~40 Mb up to ~800 Mb (autocannon with 60 sec duration and 10 connections) and it never comes down.
Reproduction
https://github.com/juusopiikkila/nuxt-urql-memory-leak
Urql version
@urql/vue v1.1.2
Validations
The text was updated successfully, but these errors were encountered: