#4946 inefficient LDAPEntry._sync_attr
Closed: wontfix 5 years ago Opened 9 years ago by pvoborni.

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

7 years ago

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)

5 years ago

Login to comment on this ticket.

Metadata