The following are the list of improvements done: - make the threads pools dynamic by allowing to grow/shrink when required - determining the min threads that a thread pool should have based on a ratio (configurable) between max and min number of threads - using a custom thread factory (extending from java.util.concurrent.ThreadFactory) - give a proper name to created threads based on the context (useful for identifying the thread and its origin for debugging purposes) - adding graceful thread pool termination support - using scheduled thread pools per Monitor than using a static scheduled thread pool for all monitors
Will commit the changes. On Thu, Dec 3, 2015 at 5:41 PM, Imesh Gunaratne <im...@apache.org> wrote: > > > On Thu, Dec 3, 2015 at 10:20 AM, Isuru Haththotuwa <isu...@apache.org> > wrote: >> >> This is in addition to the scheduled executor services we are using. >> Shall we optimize the StratosThreadPool implementation to dynamically >> shrink and grow when required? We are currently using fixed thread pools. >> > +1 > >> >> >> >> On Sun, Nov 22, 2015 at 12:15 PM, Imesh Gunaratne <im...@apache.org> >> wrote: >> >>> Hi Akila, >>> >>> On Sat, Nov 21, 2015 at 1:20 PM, Akila Ravihansa Perera < >>> raviha...@wso2.com> wrote: >>> >>>> >>>> Any idea why thread pools are created per monitor object? Is it not >>>> possible to share a common thread pool as per the current design? >>>> >>> >>> No, we do not create a thread pool per monitor object, have a look at >>> the code carefully: >>> >>> executorService = StratosThreadPool.getExecutorService( >>> AutoscalerConstants.MONITOR_THREAD_POOL_ID, >>> threadPoolSize); >>> >>> The above statement ask Stratos Thread Pool class to return an executor >>> service with the name AutoscalerConstants.MONITOR_THREAD_POOL_ID: >>> >>> public static ExecutorService getExecutorService(String identifier, int >>> threadPoolSize) { >>> ExecutorService executorService = >>> executorServiceMap.get(identifier); >>> if (executorService == null) { >>> synchronized (executorServiceMapLock) { >>> if (executorService == null) { >>> executorService = >>> Executors.newFixedThreadPool(threadPoolSize); >>> executorServiceMap.put(identifier, executorService); >>> log.info(String.format("Thread pool created: [type] >>> Executor Service [id] %s [size] %d", identifier, threadPoolSize)); >>> } >>> } >>> } >>> return executorService; >>> } >>> >>> This will only create an executor service once for a given identifier. >>> >>> Thanks >>> >>> >>>> >>>> Stratos server thread count goes beyond 1500 when deploying 2 or 3 >>>> apps. And it keeps growing proportional to the deployed app count. This is >>>> a very high resource usage. >>>> >>>> [1] >>>> https://github.com/apache/stratos/blob/stratos-4.1.x/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java#L108 >>>> >>>> [2] >>>> https://github.com/apache/stratos/blob/stratos-4.1.x/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java#L82 >>>> >>>> [3] >>>> https://github.com/apache/stratos/blob/stratos-4.1.x/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java#L88 >>>> >>>> [4] >>>> https://github.com/apache/stratos/blob/stratos-4.1.x/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java#L112 >>>> >>>> Thanks. >>>> >>>> -- >>>> Akila Ravihansa Perera >>>> WSO2 Inc.; http://wso2.com/ >>>> >>>> Blog: http://ravihansa3000.blogspot.com >>>> >>> >>> >>> >>> -- >>> Imesh Gunaratne >>> >>> Senior Technical Lead, WSO2 >>> Committer & PMC Member, Apache Stratos >>> >>> -- >>> Thanks and Regards, >>> >>> Isuru H. >>> +94 716 358 048* <http://wso2.com/>* >>> >>> >>> * <http://wso2.com/>* >>> >>> >>> > > > -- > Imesh Gunaratne > > Senior Technical Lead, WSO2 > Committer & PMC Member, Apache Stratos > > -- > Thanks and Regards, > > Isuru H. > +94 716 358 048* <http://wso2.com/>* > > > * <http://wso2.com/>* > > >