> we decided to limit the number of testing forks/disable fork reuse for almost all tests

IT cases were generally not reusing forks for as long as I can remember. A few modules opted into fork-reuse; most didn't. The Table API recently enabled fork-reuse, started causing OOMs due to memory leaks, which have since been fixed and fork-reuse has been enabled again.

> machine that has 7GB of RAM in total

This is indeed the case for the azure-provided machines (used for e2e tests and contributor builds).

The machines we use for apache/flink / PRs have 64GB ram in total, spread over 7 agents, so about ~8 per agent and roughly equivalent to the azure machines if you account for some overhead.
I'm not aware of any explicit assignment of off-heap memory.
This has worked fine in the past, and anytime we ran into OOM errors we were eventually able to pinpoint the cause to some memory leak in Flink. I thus assume that the OOMs we've recently seen are again due to some new leak.


Overall I appreciate the sentiment of using less resources for unit tests, but I don't see how it would really address the issue. You still have the potential for all agents running ITCases at the same time, leaving us in the status-quo. It could reduce the likelihood of OOMs, but so long as leaks are there it is inevitable that we hit one. (And as mush as I hate it, if there is a leak I'd kinda prefer that to be more visible, as it seems the only way to get people to look into leaks at all is getting into a situation where everyone is seriously annoyed.)

Instead we could try decreasing the general memory usage slightly (even 256mb less would give us a nice buffer on the alibaba machines), and I would hazard a guess that it'd barely reduce testing times (since most ITCases shouldn't hit that limit anyway).

I do agree that in the long-term we should strive towards re-using forks, and I know that Francesco also looked into executing test cases in parallel using JUnit5 to speed things up. But there are a number of classes that make this quite difficult; singletons like FileSystem/GlobalConfiguration, anything using static stuff like context environments (not sure if this still applies), legacy testing code, class-loading bugs in libraries etc etc.

I would actually split ITCases into 2 categories depending on whether they work with fork-reuse.

On 31/03/2022 14:48, Piotr Nowojski wrote:
Hi devs,

Recently we were plagued with OOM errors and as a result we decided to
limit the number of testing forks/disable fork reuse for almost all tests.
Currently AFAIK each JVM fork has assigned 4GB of memory (2GB heap and 2GB
off heap) and we are running two forks, on a machine that has 7GB of RAM in
total.

What I would like to discuss is to introduce test categories, for example
small and large tests, where small tests would require less memory and thus
we would be able to increase the number of forks for them. We could
probably achieve this differentiation via different means (annotations,
test naming conventions, etc), but I would propose to just re-use our
pre-existing convention of suffixing more "unity" testing classes with
`Test` suffix, while more "integration like" classes with `ITCase` suffix.
We could keep running `ITCase`'s with two forks 4GB memory each, while for
example unit tests we could run with four forks 2GB memory each.

What do you think?

Best,
Piotrek


Reply via email to