]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
config: server: improvements to get number of CPUs
authorAleš <ales.mrazek@nic.cz>
Tue, 29 Jun 2021 13:15:21 +0000 (15:15 +0200)
committerAleš Mrázek <ales.mrazek@nic.cz>
Fri, 8 Apr 2022 14:17:52 +0000 (16:17 +0200)
manager/knot_resolver_manager/datamodel/server_config.py

index e8dcc49150772818e675193109cc8a944ca43e76..8ef010d3e63f97d8fe8b5007a52520347efd0b1e 100644 (file)
@@ -1,12 +1,32 @@
+import logging
 import os
 from typing import Optional, Union
 
 from typing_extensions import Literal
 
 from knot_resolver_manager.compat.dataclasses import dataclass
+from knot_resolver_manager.datamodel.errors import DataValidationError
 from knot_resolver_manager.utils.dataclasses_parservalidator import DataclassParserValidatorMixin
 
-from .errors import DataValidationError
+logger = logging.getLogger(__name__)
+
+
+def _cpu_count() -> int:
+    try:
+        return len(os.sched_getaffinity(0))
+    except (NotImplementedError, AttributeError):
+        logger.warning(
+            "The number of usable CPUs could not be determined using 'os.sched_getaffinity()'."
+            "Attempting to get the number of system CPUs using 'os.cpu_count()'"
+        )
+        cpus = os.cpu_count()
+        if cpus is None:
+            raise DataValidationError(
+                "The number of available CPUs to automatically set the number of running"
+                "'kresd' workers could not be determined."
+                "The number can be specified manually in 'server:instances' configuration option."
+            )
+        return cpus
 
 
 @dataclass
@@ -20,12 +40,7 @@ class ServerConfig(DataclassParserValidatorMixin):
         if isinstance(self.instances, int):
             self._instances = self.instances
         elif self.instances == "auto":
-            cpu_count = os.cpu_count()
-            if cpu_count is not None:
-                self._instances = cpu_count
-            else:
-                # TODO: do better logging
-                print("cannot find number of system available CPUs")
+            self._instances = _cpu_count()
 
     def get_instances(self) -> int:
         return self._instances