1515
1616from __future__ import absolute_import , division , print_function
1717
18+ import platform
1819import re
1920import os
2021
2122from _types import Capacity
2223from _errno import EC_OBSERVER_NOT_ENOUGH_MEMORY_ALAILABLE , EC_OBSERVER_NOT_ENOUGH_MEMORY_CACHED , EC_OBSERVER_GET_MEMINFO_FAIL
2324import _errno as err
2425
26+ IS_DARWIN = platform .system () == 'Darwin'
27+
2528
2629def get_system_memory (memory_limit ):
2730 if memory_limit < 12 << 30 :
@@ -102,22 +105,44 @@ def generate_general_config(plugin_context, generate_config_mini=False, auto_dep
102105 min_pool_memory = server_config ['__min_full_resource_pool_memory' ]
103106 min_memory = max (system_memory , MIN_MEMORY )
104107 if ip not in ip_server_memory_info :
105- ret = client .execute_command ('cat /proc/meminfo' )
106- if ret :
107- ip_server_memory_info [ip ] = server_memory_stats = {}
108- memory_key_map = {
109- 'MemTotal' : 'total' ,
110- 'MemFree' : 'free' ,
111- 'MemAvailable' : 'available' ,
112- 'Buffers' : 'buffers' ,
113- 'Cached' : 'cached'
114- }
115- for key in memory_key_map :
116- server_memory_stats [memory_key_map [key ]] = 0
117- for k , v in re .findall ('(\w+)\s*:\s*(\d+\s*\w+)' , ret .stdout ):
118- if k in memory_key_map :
119- key = memory_key_map [k ]
120- server_memory_stats [key ] = Capacity (str (v )).bytes
108+ if IS_DARWIN :
109+ ret = client .execute_command ('sysctl hw.memsize' )
110+ if ret :
111+ try :
112+ total_mem = int (re .findall (r'hw\.memsize:\s*(\d+)' , ret .stdout )[0 ])
113+ vm_ret = client .execute_command ('vm_stat' )
114+ page_size = 16384
115+ ps_match = re .search (r'page size of (\d+) bytes' , vm_ret .stdout ) if vm_ret else None
116+ if ps_match :
117+ page_size = int (ps_match .group (1 ))
118+ free_pages = int (re .findall (r'Pages free:\s+(\d+)' , vm_ret .stdout )[0 ]) if vm_ret else 0
119+ inactive_pages = int (re .findall (r'Pages inactive:\s+(\d+)' , vm_ret .stdout )[0 ]) if vm_ret else 0
120+ ip_server_memory_info [ip ] = server_memory_stats = {
121+ 'total' : total_mem ,
122+ 'free' : free_pages * page_size ,
123+ 'available' : (free_pages + inactive_pages ) * page_size ,
124+ 'buffers' : 0 ,
125+ 'cached' : inactive_pages * page_size
126+ }
127+ except Exception :
128+ stdio .exception ('Failed to parse macOS memory info' )
129+ else :
130+ ret = client .execute_command ('cat /proc/meminfo' )
131+ if ret :
132+ ip_server_memory_info [ip ] = server_memory_stats = {}
133+ memory_key_map = {
134+ 'MemTotal' : 'total' ,
135+ 'MemFree' : 'free' ,
136+ 'MemAvailable' : 'available' ,
137+ 'Buffers' : 'buffers' ,
138+ 'Cached' : 'cached'
139+ }
140+ for key in memory_key_map :
141+ server_memory_stats [memory_key_map [key ]] = 0
142+ for k , v in re .findall ('(\w+)\s*:\s*(\d+\s*\w+)' , ret .stdout ):
143+ if k in memory_key_map :
144+ key = memory_key_map [k ]
145+ server_memory_stats [key ] = Capacity (str (v )).bytes
121146
122147 if user_server_config .get ('memory_limit_percentage' ):
123148 if ip in ip_server_memory_info :
@@ -180,7 +205,10 @@ def generate_general_config(plugin_context, generate_config_mini=False, auto_dep
180205
181206 # cpu
182207 if not server_config .get ('cpu_count' ):
183- ret = client .execute_command ("grep -e 'processor\s*:' /proc/cpuinfo | wc -l" )
208+ if IS_DARWIN :
209+ ret = client .execute_command ("sysctl -n hw.ncpu" )
210+ else :
211+ ret = client .execute_command ("grep -e 'processor\s*:' /proc/cpuinfo | wc -l" )
184212 if ret and ret .stdout .strip ().isdigit ():
185213 cpu_num = int (ret .stdout )
186214 server_config ['cpu_count' ] = max (MIN_CPU_COUNT , int (cpu_num - 2 ))
@@ -196,7 +224,8 @@ def generate_general_config(plugin_context, generate_config_mini=False, auto_dep
196224 log_disk_size = Capacity (server_config .get ('log_disk_size' , 0 )).bytes
197225 if not server_config .get ('datafile_size' ) or not server_config .get ('log_disk_size' ):
198226 disk = {'/' : 0 }
199- ret = client .execute_command ('df --block-size=1024' )
227+ df_cmd = 'df -Pk' if IS_DARWIN else 'df --block-size=1024'
228+ ret = client .execute_command (df_cmd )
200229 if ret :
201230 for total , used , avail , puse , path in re .findall ('(\d+)\s+(\d+)\s+(\d+)\s+(\d+%)\s+(.+)' , ret .stdout ):
202231 disk [path ] = {
@@ -206,7 +235,7 @@ def generate_general_config(plugin_context, generate_config_mini=False, auto_dep
206235 }
207236 for include_dir in dirs .values ():
208237 while include_dir not in disk :
209- ret = client .execute_command ('df --block-size=1024 %s' % include_dir )
238+ ret = client .execute_command ('%s %s' % ( df_cmd , include_dir ) )
210239 if ret :
211240 for total , used , avail , puse , path in re .findall ('(\d+)\s+(\d+)\s+(\d+)\s+(\d+%)\s+(.+)' , ret .stdout ):
212241 disk [path ] = {
0 commit comments