LDAPEntry._sync_attr is very inefficient for entries with many values in member attributes.
I.e. with group-show of ipauser group, where the group has, e.g., 30 000 users, processing of it can take up to 1-2 minutes, and about 900MB of RAM(whole httpd thread).
The result is that server is under heavy load and ipa client timeouts before it can get the response.
The biggest pain point is construction of DNs and a deep copy of both lists:
for value in raw_adds: value = self._conn.decode(value, name) if value in nice_dels: continue nice.append(value) self._sync[name] = (deepcopy(nice), deepcopy(raw))
profiling of LDAPObject.convert_attribute_members
we can see that _sync_attr took about 90s to process. The rest are other inefficiencies in convert_attribute_members.
76022939 function calls (68402685 primitive calls) in 114.258 seconds Ordered by: cumulative time ncalls tottime percall cumtime percall filename:lineno(function) 30005 0.062 0.000 90.404 0.003 /usr/lib64/python2.7/_abcoll.py:571(setdefault) 30005 0.086 0.000 90.339 0.003 /usr/lib/python2.7/site-packages/ipapython/ipaldap.py:937(__getitem__) 30005 0.109 0.000 90.253 0.003 /usr/lib/python2.7/site-packages/ipapython/ipaldap.py:904(_get_nice) 1 1.075 1.075 89.502 89.502 /usr/lib/python2.7/site-packages/ipapython/ipaldap.py:777(_sync_attr) 3990135/2 15.379 0.000 62.534 31.267 /usr/lib64/python2.7/copy.py:145(deepcopy) 300012/2 1.509 0.000 62.534 31.267 /usr/lib64/python2.7/copy.py:226(_deepcopy_list) 570019/30001 6.063 0.000 61.360 0.002 /usr/lib64/python2.7/copy.py:306(_reconstruct) 570019/30001 2.718 0.000 59.645 0.002 /usr/lib64/python2.7/copy.py:253(_deepcopy_dict) 90003 0.180 0.000 31.233 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:1220(__init__) 90003 0.453 0.000 31.053 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:1259(_rdns_from_sequence) 150005 3.146 0.000 30.478 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:1223(_rdn_from_value) 30001 0.182 0.000 19.676 0.001 /usr/lib/python2.7/site-packages/ipapython/ipaldap.py:438(decode) 750025 1.398 0.000 19.280 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:832(__init__) 750025 1.830 0.000 17.446 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:871(_avas_from_sequence) 750025 5.349 0.000 14.883 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:836(_ava_from_value) 1020034 2.945 0.000 14.850 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:557(__init__) 570019 7.349 0.000 13.164 0.000 /usr/lib64/python2.7/copy.py:234(_deepcopy_tuple) 60002 0.119 0.000 9.501 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:1383(endswith) 60002 0.277 0.000 9.331 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:1398(_tailmatch) 60002 0.659 0.000 8.719 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:1338(_cmp_sequence) 1350045/270009 0.985 0.000 7.313 0.000 {cmp} 570019 7.190 0.000 7.190 0.000 {method '__reduce_ex__' of 'object' objects} 1020034 3.713 0.000 7.045 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:595(_set_attr) 270009 1.365 0.000 6.994 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:967(__cmp__) 30001 0.130 0.000 6.206 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:1301(__hash__) 30001 0.109 0.000 6.040 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:1273(__str__) 10890391 5.623 0.000 5.623 0.000 {isinstance} 2580095 3.821 0.000 5.221 0.000 /usr/lib64/python2.7/copy.py:267(_keep_alive) 7170253 4.511 0.000 4.511 0.000 {method 'get' of 'dict' objects} 1020034 1.902 0.000 4.349 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:615(_set_value) 570019 3.863 0.000 3.863 0.000 {range} 570030 1.274 0.000 3.461 0.000 {method 'decode' of 'str' objects} 6210208/5040169 2.547 0.000 3.397 0.000 {len} 30001 0.661 0.000 3.072 0.000 /usr/lib64/python2.7/site-packages/ldap/dn.py:56(dn2str) 30001 1.426 0.000 2.859 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:1270(_to_openldap) 270009 1.406 0.000 2.388 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:691(__cmp__) 570030 0.634 0.000 2.188 0.000 /usr/lib64/python2.7/encodings/utf_8.py:15(decode) 270009 1.267 0.000 2.187 0.000 /usr/lib64/python2.7/site-packages/ldap/dn.py:20(escape_dn_chars) 6060209 2.172 0.000 2.172 0.000 {method 'append' of 'list' objects} 8580301 2.129 0.000 2.129 0.000 {id} 570030 1.553 0.000 1.553 0.000 {_codecs.utf_8_decode} 1200040 1.480 0.000 1.480 0.000 {getattr} 570019 0.773 0.000 1.141 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:1289(__getitem__) 570022 1.100 0.000 1.100 0.000 {hasattr} 570019 0.623 0.000 1.020 0.000 /usr/lib64/python2.7/copy_reg.py:92(__newobj__) 1050035 0.758 0.000 1.015 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:898(__len__) 30001 0.308 0.000 0.984 0.000 /usr/lib/python2.7/site-packages/ipapython/ipaldap.py:355(get_type) 2430081 0.920 0.000 0.920 0.000 {method 'replace' of 'str' objects} 570022 0.818 0.000 0.818 0.000 {method 'encode' of 'unicode' objects} 570019 0.751 0.000 0.751 0.000 {method 'update' of 'dict' objects} 540018 0.595 0.000 0.736 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:901(__getitem__) 4 0.731 0.183 0.731 0.183 /usr/lib/python2.7/site-packages/ipapython/ipaldap.py:944(__delitem__) 30001 0.084 0.000 0.661 0.000 /usr/lib64/python2.7/site-packages/ldap/dn.py:42(str2dn) 30009 0.098 0.000 0.632 0.000 /usr/lib/python2.7/site-packages/ipapython/ipaldap.py:899(_get_attr_name) 30001 0.089 0.000 0.578 0.000 /usr/lib64/python2.7/site-packages/ldap/functions.py:43(_ldap_function_call) 1320044 0.548 0.000 0.548 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:592(_get_attr) 30001 0.115 0.000 0.517 0.000 /usr/lib/python2.7/site-packages/ipalib/plugins/baseldap.py:592(get_primary_key_from_dn) 1320044 0.509 0.000 0.509 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:612(_get_value) 30001 0.488 0.000 0.488 0.000 {str2dn} 1110085 0.478 0.000 0.478 0.000 {method 'lower' of 'unicode' objects} 750025 0.436 0.000 0.436 0.000 {method 'sort' of 'list' objects} 570019 0.434 0.000 0.434 0.000 {issubclass} 570019 0.397 0.000 0.397 0.000 {built-in method __new__ of type object at 0x7fea6bd51280} 30004 0.059 0.000 0.394 0.000 /usr/lib64/python2.7/site-packages/ldap/schema/subentry.py:243(get_obj) 30012 0.071 0.000 0.389 0.000 /usr/lib/python2.7/site-packages/ipapython/ipaldap.py:822(_attr_name) 30004 0.163 0.000 0.335 0.000 /usr/lib64/python2.7/site-packages/ldap/schema/subentry.py:206(getoid) 60002 0.126 0.000 0.325 0.000 /usr/lib/python2.7/site-packages/ipalib/base.py:461(__getitem__) 540018 0.280 0.000 0.280 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:891(_next) 570019 0.277 0.000 0.277 0.000 {method 'iteritems' of 'dict' objects} 570019 0.225 0.000 0.225 0.000 {method 'join' of 'str' objects} 270009 0.199 0.000 0.199 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:895(__iter__) 570026 0.167 0.000 0.167 0.000 /usr/lib64/python2.7/copy.py:198(_deepcopy_atomic) 30039 0.099 0.000 0.144 0.000 /usr/lib/python2.7/site-packages/ipapython/ipautil.py:473(__getitem__) 30004 0.101 0.000 0.126 0.000 /usr/lib/python2.7/site-packages/ipapython/ipautil.py:517(__contains__) 120004 0.091 0.000 0.121 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:1286(__len__) 30001 0.117 0.000 0.117 0.000 {method 'encode' of 'str' objects} 30004 0.064 0.000 0.108 0.000 /usr/lib64/python2.7/site-packages/ldap/cidict.py:26(__getitem__) 30001 0.070 0.000 0.102 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:913(_get_attr) 150005 0.078 0.000 0.078 0.000 {method 'extend' of 'list' objects} 30001 0.050 0.000 0.070 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:926(_get_value) 60008 0.050 0.000 0.050 0.000 /usr/lib/python2.7/site-packages/ipapython/ipaldap.py:311(_get_schema) 30004 0.031 0.000 0.044 0.000 /usr/lib64/python2.7/string.py:220(lower) 90006 0.042 0.000 0.042 0.000 {method 'lower' of 'str' objects} 60002 0.039 0.000 0.039 0.000 /usr/lib/python2.7/site-packages/ipapython/dn.py:483(_adjust_indices) 30004 0.034 0.000 0.034 0.000 {method 'split' of 'str' objects} 60002 0.033 0.000 0.033 0.000 /usr/lib/python2.7/site-packages/ipalib/plugable.py:239(__get_api) 30004 0.030 0.000 0.030 0.000 {method 'strip' of 'str' objects} 30039 0.023 0.000 0.023 0.000 {function __getitem__ at 0x7fea66a616e0} 30001 0.018 0.000 0.018 0.000 {hash} 30004 0.013 0.000 0.013 0.000 {function __contains__ at 0x7fea66a618c0} 3 0.000 0.000 0.003 0.001 /usr/lib/python2.7/site-packages/ipapython/ipaldap.py:896(__setitem__) 3 0.003 0.001 0.003 0.001 /usr/lib/python2.7/site-packages/ipapython/ipaldap.py:854(_set_nice) 3 0.000 0.000 0.000 0.000 /usr/lib/python2.7/site-packages/ipapython/ipaldap.py:833(_add_attr_name) 4 0.000 0.000 0.000 0.000 /usr/lib/python2.7/site-packages/ipapython/ipautil.py:535(items) 25 0.000 0.000 0.000 0.000 /usr/lib/python2.7/site-packages/ipapython/ipautil.py:546(<genexpr>) 3 0.000 0.000 0.000 0.000 /usr/lib64/python2.7/copy_reg.py:95(_slotnames) 9 0.000 0.000 0.000 0.000 /usr/lib/python2.7/site-packages/ipapython/ipautil.py:523(get) 3 0.000 0.000 0.000 0.000 /usr/lib/python2.7/site-packages/ipapython/ipautil.py:476(__setitem__) 4 0.000 0.000 0.000 0.000 /usr/lib/python2.7/site-packages/ipapython/ipautil.py:545(iteritems) 4 0.000 0.000 0.000 0.000 /usr/lib/python2.7/site-packages/ipapython/ipautil.py:491(__delitem__) 8 0.000 0.000 0.000 0.000 {method 'discard' of 'set' objects} 7 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects} 3 0.000 0.000 0.000 0.000 {method 'get' of 'dictproxy' objects} 4 0.000 0.000 0.000 0.000 {method 'itervalues' of 'dict' objects} 3 0.000 0.000 0.000 0.000 {method 'keys' of 'dict' objects} 1 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects} 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
Processing leftovers from 4.2 backlog - this ticket was found as suitable for consideration in next big feature release - 4.4.
Metadata Update from @pvoborni: - Issue assigned to someone - Issue set to the milestone: FreeIPA 4.5 backlog
Thank you taking time to submit this request for FreeIPA. Unfortunately this bug was not given priority and the team lacks the capacity to work on it at this time.
Given that we are unable to fulfil this request I am closing the issue as wontfix. To request re-consideration of this decision please reopen this issue and provide additional technical details about its importance to you.
Metadata Update from @rcritten: - Issue close_status updated to: wontfix - Issue status updated to: Closed (was: Open)
Login to comment on this ticket.