Hello all! Just curious what y’alls typical setup is when it comes to running multiple stacks which require the same “support” containers.

What I mean is, say you want to run two services that both require a connection to a database, would you run two separate DB containers, one for each service and have them connected only to their respective DB “stacks”? Or do you prefer to run a single centralized DB server/service and have your self hosted stacks all communicate with their own databases inside the server?

  • brennor@kbin.social
    link
    fedilink
    arrow-up
    11
    ·
    1 year ago

    I take the latter approach – a single PostgreSQL database service for all other containers to use. That allows me to concentrate memory/CPU to a single service and optimize for that. I’ve found that a single database service uses less total resources (especially memory) than running separate DB stacks for each service.

    • nickwitha_k (he/him)@lemmy.sdf.org
      link
      fedilink
      English
      arrow-up
      5
      ·
      1 year ago

      I’ve found that a single database service uses less total resources (especially memory) than running separate DB stacks for each service.

      This should indeed be the expected result. Each DB server will have a set amount of overhead from the runtime before data overhead comes in. Ex (made up numbers):

      • storage subsystem=256MB
      • config subsystem=128MB
      • auth subsystem=280MB
      • api subsystem=512MB
      • user tables=xMB

      The subsystem resource usage would be incurred by every instance of the DB server. Additionally, you have platform-level overhead, especially if you are running as VMs or containers as that requires additional resources to coordinate with the kernel, etc.

      It’s very much like micro-kernels vs monoliths. On the surface a lean micro-kernel seems like it should be more performant since less is happening during kernel time but, the significant increase in operations to perform basic tasks. For example, if storage access was in userspace, an application would need to call back to the kernel to request communication, which would need to call up to the storage driver, then back… and it becomes a death of a thousand cuts. In a monolithic kernel, the application just tells the kernel that it wants to access storage, what mode, and provide either the input or a buffer receive data.