4646import time
4747
4848import immutables
49+ import psutil
4950
5051from edb .common import debug
5152from edb .common import lru
@@ -208,6 +209,7 @@ async def _request(
208209class Worker (BaseWorker ):
209210
210211 _pid : int
212+ _proc : psutil .Process
211213 _manager : BaseLocalPool
212214 _server : amsg .Server
213215
@@ -221,6 +223,7 @@ def __init__(
221223 super ().__init__ (* args )
222224
223225 self ._pid = pid
226+ self ._proc = psutil .Process (pid )
224227 self ._manager = manager
225228 self ._server = server
226229
@@ -237,6 +240,9 @@ async def _attach(self, init_args_pickled: bytes) -> None:
237240 def get_pid (self ) -> int :
238241 return self ._pid
239242
243+ def get_rss (self ) -> int :
244+ return self ._proc .memory_info ().rss // 1024
245+
240246 def close (self ) -> None :
241247 if self ._closed :
242248 return
@@ -835,6 +841,7 @@ class BaseLocalPool(
835841
836842 _poolsock_name : str
837843 _pool_size : int
844+ _worker_max_rss : Optional [int ]
838845 _server : Optional [amsg .Server ]
839846 _ready_evt : asyncio .Event
840847 _running : Optional [bool ]
@@ -846,6 +853,7 @@ def __init__(
846853 * ,
847854 runstate_dir : str ,
848855 pool_size : int ,
856+ worker_max_rss : Optional [int ] = None ,
849857 ** kwargs : Any ,
850858 ) -> None :
851859 super ().__init__ (** kwargs )
@@ -859,6 +867,7 @@ def __init__(
859867
860868 assert pool_size >= 1
861869 self ._pool_size = pool_size
870+ self ._worker_max_rss = worker_max_rss
862871 self ._workers = {}
863872
864873 self ._server = amsg .Server (self ._poolsock_name , self ._loop , self )
@@ -1036,6 +1045,12 @@ def _release_worker(
10361045 ) -> None :
10371046 # Skip disconnected workers
10381047 if worker .get_pid () in self ._workers :
1048+ if self ._worker_max_rss is not None :
1049+ if worker .get_rss () > self ._worker_max_rss :
1050+ if debug .flags .server :
1051+ print (f"HIT MEMORY LIMIT, KILLING { worker .get_pid ()} " )
1052+ worker .close ()
1053+ return
10391054 self ._workers_queue .release (worker , put_in_front = put_in_front )
10401055
10411056 def get_debug_info (self ) -> dict [str , Any ]:
0 commit comments