I agree, the current calculation logic is already complicated.
I just think that not using managed memory complicates the memory model
even further.

But as I mentioned earlier, both approaches have their pros and cons, so
I'll update the proposal to use unmanaged memory.

Thanks!

Regards,
Roman


On Thu, Nov 17, 2022 at 3:25 AM Xintong Song <tonysong...@gmail.com> wrote:

> Agreed that the documentation regarding managed memory could be improved.
>
> Just to clarify, breaking isolation is just one of the concerns. I think my
> biggest concern is the extra complexity in managed memory calculations.
> I've been reached out by many users, online or offline, asking about the
> managed memory calculation. Even with my help, it's not easy for all users
> to understand, giving me the impression that the current calculation logics
> are already quite complicated. That's why I'd be hesitant to further
> complicate it. Treating the shared rocksdb memory as something
> independent from managed memory would help in that sense.
>
> - there's one more memory type, in addition to 8 existing types [2]
> >
> - its size needs to be calculated manually
>
> Not necessarily. We may consider it as part of the framework.off-heap
> memory. And we can still have some automatic calculations, e.g., allowing
> using up to a certain fraction of the off-heap framework memory.
>
> - flink code needs to take this into account and "adjust" the weights
> >
> We already have Memory/FsStateBackend that does not use managed memory. To
> exclude the state backend from the managed memory calculations, you just
> need to return `false` for `StateBackend#useManagedMemory`. That's why I
> suggest a variant of the rocksdb state backend, where you can reuse most of
> the original rocksdb state backend codes.
>
> Best,
>
> Xintong
>
>
>
> On Thu, Nov 17, 2022 at 4:20 AM Roman Khachatryan <ro...@apache.org>
> wrote:
>
> > > I think not being able to isolate all kinds of memory does not mean we
> > > should give up the isolation on all kinds of memory. And I believe
> > "managed
> > > memory is isolated and others are not" is much easier for the users to
> > > understand compared to "part of the managed memory is isolated and
> others
> > > are not".
> >
> > It looks like the users can not infer that managed memory has the
> isolation
> > property:
> > neither documentation [1] nor the FILP don't mention that. I guess this
> is
> > because isolation is not its most important property (see below).
> >
> > An explicit option would be self-documenting and will let the users know
> > what memory is shared and what isn't.
> >
> > From my perspective, the most important property is shared budget which
> > allows
> > to avoid:
> > 1) OOM errors when there are too many consumers (i.e. tasks)
> > 2) manual calculation of memory for each type of consumer
> >
> > Both these properties are desirable for shared and non-shared memory;
> > as well as not wasting memory if there is no consumer as you described.
> >
> > OTH, using *unmanaged* shared memory for RocksDB implies:
> > - there's one more memory type, in addition to 8 existing types [2]
> > - its size needs to be calculated manually
> > - flink code needs to take this into account and "adjust" the weights
> >
> > Having said that, I'd be fine with either approach as both seem to have
> > pros and cons.
> >
> > What do you think?
> >
> > [1]
> >
> >
> https://nightlies.apache.org/flink/flink-docs-release-1.16/docs/deployment/memory/mem_setup_tm/#managed-memory
> > [2]
> >
> >
> https://nightlies.apache.org/flink/flink-docs-release-1.16/docs/deployment/memory/mem_setup_tm/#detailed-memory-model
> >
> > Regards,
> > Roman
> >
> >
> > On Wed, Nov 16, 2022 at 4:01 AM Xintong Song <tonysong...@gmail.com>
> > wrote:
> >
> > > Concerning isolation, I think ideally we want everything to be isolated
> > > between jobs running in the same cluster (i.e., slots in the same TM).
> > > Unfortunately, this is impractical.
> > > - Heap / Off-heap memory are directly allocated / deallocated through
> > JVM /
> > > OS. Flink does not have a good way to cap their usages per slot.
> > > - Network memory does not have the good property of managed memory,
> that
> > a
> > > job can adapt to any given amount of managed memory (with a very small
> > min
> > > limitation). We are trying to improve network memory towards that
> > > direction, and once achieved it can be isolated as well.
> > > I think not being able to isolate all kinds of memory does not mean we
> > > should give up the isolation on all kinds of memory. And I believe
> > "managed
> > > memory is isolated and others are not" is much easier for the users to
> > > understand compared to "part of the managed memory is isolated and
> others
> > > are not".
> > >
> > > By waste, I meant reserving a certain amount of memory that is only
> used
> > by
> > > certain use cases that do not always exist. This is exactly what we
> want
> > to
> > > avoid with managed memory in FLIP-49 [1]. We used to have managed
> memory
> > > only used for batch operators, and a containerized-cut-off memory
> > > (something similar to framework.off-heap) for rocksdb state backend.
> The
> > > problem was that, if the user does not change the configuration when
> > > switching between streaming / batch jobs, there would always be some
> > memory
> > > (managed or cut-off) wasted. Similarly, introducing a shared managed
> > memory
> > > zone means reserving one more dedicated part of memory that can get
> > wasted
> > > in many cases. This is probably a necessary price for this new feature,
> > but
> > > let's not break the concept / properties of managed memory for it.
> > >
> > > In your proposal, the fraction for the share managed memory is by
> default
> > > 0. That means to enable the rocksdb memory sharing, users need to
> > manually
> > > increase the fraction anyway. Thus, having the memory sharing rocksdb
> use
> > > managed memory or off-heap memory does not make a significant
> difference
> > > for the new feature users. I'd think of this as "extra operational
> > overhead
> > > for users of a certain new feature" vs. "significant learning cost and
> > > potential behavior change for pretty much all users". I'd be fine with
> > > having some shortcuts to simplify the configuration on the user side
> for
> > > this new feature, but not to invade the managed memory.
> > >
> > > Best,
> > >
> > > Xintong
> > >
> > >
> > > [1]
> > >
> > >
> >
> https://cwiki.apache.org/confluence/display/FLINK/FLIP-49%3A+Unified+Memory+Configuration+for+TaskExecutors
> > >
> > > On Tue, Nov 15, 2022 at 5:46 PM Khachatryan Roman <
> > > khachatryan.ro...@gmail.com> wrote:
> > >
> > > > Thanks for your reply Xingong Song,
> > > >
> > > > Could you please elaborate on the following:
> > > >
> > > > > The proposed changes break several good properties that we designed
> > for
> > > > > managed memory.
> > > > > 1. It's isolated across slots
> > > > Just to clarify, any way to manage the memory efficiently while
> capping
> > > its
> > > > usage
> > > > will break the isolation. It's just a matter of whether it's managed
> > > memory
> > > > or not.
> > > > Do you see any reasons why unmanaged memory can be shared, and
> managed
> > > > memory can not?
> > > >
> > > > > 2. It should never be wasted (unless there's nothing in the job
> that
> > > > needs
> > > > > managed memory)
> > > > If I understand correctly, the managed memory can already be wasted
> > > because
> > > > it is divided evenly between slots, regardless of the existence of
> its
> > > > consumers in a particular slot.
> > > > And in general, even if every slot has RocksDB / python, it's not
> > > > guaranteed equal consumption.
> > > > So this property would rather be fixed in the current proposal.
> > > >
> > > > > In addition, it further complicates configuration / computation
> > logics
> > > of
> > > > > managed memory.
> > > > I think having multiple options overriding each other increases the
> > > > complexity for the user. As for the computation, I think it's
> desirable
> > > to
> > > > let Flink do it rather than users.
> > > >
> > > > Both approaches need some help from TM for:
> > > > - storing the shared resources (static field in a class might be too
> > > > dangerous because if the backend is loaded by the user-class-loader
> > then
> > > > memory will leak silently).
> > > > - reading the configuration
> > > >
> > > > Regards,
> > > > Roman
> > > >
> > > >
> > > > On Sun, Nov 13, 2022 at 11:24 AM Xintong Song <tonysong...@gmail.com
> >
> > > > wrote:
> > > >
> > > > > I like the idea of sharing RocksDB memory across slots. However,
> I'm
> > > > quite
> > > > > concerned by the current proposed approach.
> > > > >
> > > > > The proposed changes break several good properties that we designed
> > for
> > > > > managed memory.
> > > > > 1. It's isolated across slots
> > > > > 2. It should never be wasted (unless there's nothing in the job
> that
> > > > needs
> > > > > managed memory)
> > > > > In addition, it further complicates configuration / computation
> > logics
> > > of
> > > > > managed memory.
> > > > >
> > > > > As an alternative, I'd suggest introducing a variant of
> > > > > RocksDBStateBackend, that shares memory across slots and does not
> use
> > > > > managed memory. This basically means the shared memory is not
> > > considered
> > > > as
> > > > > part of managed memory. For users of this new feature, they would
> > need
> > > to
> > > > > configure how much memory the variant state backend should use, and
> > > > > probably also a larger framework-off-heap / jvm-overhead memory.
> The
> > > > latter
> > > > > might require a bit extra user effort compared to the current
> > approach,
> > > > but
> > > > > would avoid significant complexity in the managed memory
> > configuration
> > > > and
> > > > > calculation logics which affects broader users.
> > > > >
> > > > >
> > > > > Best,
> > > > >
> > > > > Xintong
> > > > >
> > > > >
> > > > >
> > > > > On Sat, Nov 12, 2022 at 1:21 AM Roman Khachatryan <
> ro...@apache.org>
> > > > > wrote:
> > > > >
> > > > > > Hi John, Yun,
> > > > > >
> > > > > > Thank you for your feedback
> > > > > >
> > > > > > @John
> > > > > >
> > > > > > > It seems like operators would either choose isolation for the
> > > > cluster’s
> > > > > > jobs
> > > > > > > or they would want to share the memory between jobs.
> > > > > > > I’m not sure I see the motivation to reserve only part of the
> > > memory
> > > > > for
> > > > > > sharing
> > > > > > > and allowing jobs to choose whether they will share or be
> > isolated.
> > > > > >
> > > > > > I see two related questions here:
> > > > > >
> > > > > > 1) Whether to allow mixed workloads within the same cluster.
> > > > > > I agree that most likely all the jobs will have the same
> "sharing"
> > > > > > requirement.
> > > > > > So we can drop "state.backend.memory.share-scope" from the
> > proposal.
> > > > > >
> > > > > > 2) Whether to allow different memory consumers to use shared or
> > > > exclusive
> > > > > > memory.
> > > > > > Currently, only RocksDB is proposed to use shared memory. For
> > python,
> > > > > it's
> > > > > > non-trivial because it is job-specific.
> > > > > > So we have to partition managed memory into shared/exclusive and
> > > > > therefore
> > > > > > can NOT replace "taskmanager.memory.managed.shared-fraction" with
> > > some
> > > > > > boolean flag.
> > > > > >
> > > > > > I think your question was about (1), just wanted to clarify why
> the
> > > > > > shared-fraction is needed.
> > > > > >
> > > > > > @Yun
> > > > > >
> > > > > > > I am just curious whether this could really bring benefits to
> our
> > > > users
> > > > > > with such complex configuration logic.
> > > > > > I agree, and configuration complexity seems a common concern.
> > > > > > I hope that removing "state.backend.memory.share-scope" (as
> > proposed
> > > > > above)
> > > > > > reduces the complexity.
> > > > > > Please share any ideas of how to simplify it further.
> > > > > >
> > > > > > > Could you share some real experimental results?
> > > > > > I did an experiment to verify that the approach is feasible,
> > > > > > i.e. multilple jobs can share the same memory/block cache.
> > > > > > But I guess that's not what you mean here? Do you have any
> > > experiments
> > > > in
> > > > > > mind?
> > > > > >
> > > > > > > BTW, as talked before, I am not sure whether different
> lifecycles
> > > of
> > > > > > RocksDB state-backends
> > > > > > > would affect the memory usage of block cache & write buffer
> > manager
> > > > in
> > > > > > RocksDB.
> > > > > > > Currently, all instances would start and destroy nearly
> > > > simultaneously,
> > > > > > > this would change after we introduce this feature with jobs
> > running
> > > > at
> > > > > > different scheduler times.
> > > > > > IIUC, the concern is that closing a RocksDB instance might close
> > the
> > > > > > BlockCache.
> > > > > > I checked that manually and it seems to work as expected.
> > > > > > And I think that would contradict the sharing concept, as
> described
> > > in
> > > > > the
> > > > > > documentation [1].
> > > > > >
> > > > > > [1]
> > > > > > https://github.com/facebook/rocksdb/wiki/Block-Cache
> > > > > >
> > > > > > Regards,
> > > > > > Roman
> > > > > >
> > > > > >
> > > > > > On Wed, Nov 9, 2022 at 3:50 AM Yanfei Lei <fredia...@gmail.com>
> > > wrote:
> > > > > >
> > > > > > > Hi Roman,
> > > > > > > Thanks for the proposal, this allows State Backend to make
> better
> > > use
> > > > > of
> > > > > > > memory.
> > > > > > >
> > > > > > > After reading the ticket, I'm curious about some points:
> > > > > > >
> > > > > > > 1. Is shared-memory only for the state backend? If both
> > > > > > > "taskmanager.memory.managed.shared-fraction: >0" and
> > > > > > > "state.backend.rocksdb.memory.managed: false" are set at the
> same
> > > > time,
> > > > > > > will the shared-memory be wasted?
> > > > > > > 2. It's said that "Jobs 4 and 5 will use the same 750Mb of
> > > unmanaged
> > > > > > memory
> > > > > > > and will compete with each other" in the example, how is the
> > memory
> > > > > size
> > > > > > of
> > > > > > > unmanaged part calculated?
> > > > > > > 3. For fine-grained-resource-management, the control
> > > > > > > of cpuCores, taskHeapMemory can still work, right?  And I am a
> > > little
> > > > > > > worried that too many memory-about configuration options are
> > > > > complicated
> > > > > > > for users to understand.
> > > > > > >
> > > > > > > Regards,
> > > > > > > Yanfei
> > > > > > >
> > > > > > > Roman Khachatryan <ro...@apache.org> 于2022年11月8日周二 23:22写道:
> > > > > > >
> > > > > > > > Hi everyone,
> > > > > > > >
> > > > > > > > I'd like to discuss sharing RocksDB memory across slots as
> > > proposed
> > > > > in
> > > > > > > > FLINK-29928 [1].
> > > > > > > >
> > > > > > > > Since 1.10 / FLINK-7289 [2], it is possible to:
> > > > > > > > - share these objects among RocksDB instances of the same
> slot
> > > > > > > > - bound the total memory usage by all RocksDB instances of a
> TM
> > > > > > > >
> > > > > > > > However, the memory is divided between the slots equally
> > (unless
> > > > > using
> > > > > > > > fine-grained resource control). This is sub-optimal if some
> > slots
> > > > > > contain
> > > > > > > > more memory intensive tasks than the others.
> > > > > > > > Using fine-grained resource control is also often not an
> option
> > > > > because
> > > > > > > the
> > > > > > > > workload might not be known in advance.
> > > > > > > >
> > > > > > > > The proposal is to widen the scope of sharing memory to TM,
> so
> > > that
> > > > > it
> > > > > > > can
> > > > > > > > be shared across all RocksDB instances of that TM. That would
> > > > reduce
> > > > > > the
> > > > > > > > overall memory consumption in exchange for resource
> isolation.
> > > > > > > >
> > > > > > > > Please see FLINK-29928 [1] for more details.
> > > > > > > >
> > > > > > > > Looking forward to feedback on that proposal.
> > > > > > > >
> > > > > > > > [1]
> > > > > > > > https://issues.apache.org/jira/browse/FLINK-29928
> > > > > > > > [2]
> > > > > > > > https://issues.apache.org/jira/browse/FLINK-7289
> > > > > > > >
> > > > > > > > Regards,
> > > > > > > > Roman
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>

Reply via email to