Received: by 2002:a05:7412:31a9:b0:e2:908c:2ebd with SMTP id et41csp3130038rdb; Wed, 13 Sep 2023 03:04:58 -0700 (PDT) X-Google-Smtp-Source: AGHT+IElaJYEuO1VD+mlr7dVidKCroPGc2Pyvlni+Z3PJJP0sFzhbUxpcuyRBYn+C7c6GosFkhLi X-Received: by 2002:a17:90b:4acf:b0:263:f4cc:a988 with SMTP id mh15-20020a17090b4acf00b00263f4cca988mr1818238pjb.5.1694599497950; Wed, 13 Sep 2023 03:04:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694599497; cv=none; d=google.com; s=arc-20160816; b=trZhap5NOr2vF8LmKcBbw9IN0Hc4VQWBJCtEAoleZpJLTAi/7H+t89CJNT9dL2g8Ud 5Kyi9YXtI0PGY5i3/q4iWgV4juDAzc50bcenzfjLVOKcmHxO4WMEDJaMc6A9sOMjCVlB 3WeTksXy82cy7hkfIDzFtn7H7sA828JoJ99IIG27/qLZWFaJp8ICoFxCRd+dL2Ox3r05 4MVXdsHRgI5LEMluYaRbILjbMzxeO6+AjtRQ0FVrhHwpB+hLdCaAkguwD3cRVsC9C4iT I5jcGXZehdSArfhdr7b1JcRh1rMEyDGZFeXVa/AROc3Z+Lw6cwCK9+EOhtPLBPdnlFB/ rZyg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:subject:user-agent:mime-version:date:message-id; bh=0OY6hqW+pxXMXT5eYOuHNDzkXXu2IeA3WJrvWpknwVU=; fh=5Ez95g+A3SMnjo2IPKgvcSS1CafhVOkr+jFwSM4aOd0=; b=kGoD+r8eC8RvoDpkppg3X4dMIFUEpz6MC6BqZDzYfqE/cV6u+9OSXaKaE18Nt2vh8p PKWcnjUOIWscO/akHZS238Y862S89sjKk9Nw7hd2Tk1EhVPjLrm9jWvQg50ZJdCULT25 1bb/+eypcthVZFCrH7QHkg+Sx8LqtBLCpMI6hHOmaIpEMcEV40Y8VN2YnQx8O04+8VGC HwYj3HSZDgOv3/sqvbD+z2kKLek9coqYgiGv2jYeZ2GpX1sOaOI7lw+Xga4yCa/vyozC pKjQgTha7rDI03bWvcWVCGbCPxuBwD96/6FZ40hJSYxG4Yr+I3T2e+KjAF3CHNaFZVmV O+IA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=sangfor.com.cn Return-Path: Received: from snail.vger.email (snail.vger.email. [2620:137:e000::3:7]) by mx.google.com with ESMTPS id ds6-20020a17090b08c600b0026901c2adcasi1205442pjb.132.2023.09.13.03.04.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Sep 2023 03:04:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) client-ip=2620:137:e000::3:7; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=sangfor.com.cn Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 2E09E81CE107; Wed, 13 Sep 2023 02:52:39 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239621AbjIMJw1 (ORCPT + 99 others); Wed, 13 Sep 2023 05:52:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57150 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239529AbjIMJwO (ORCPT ); Wed, 13 Sep 2023 05:52:14 -0400 Received: from mail-m12738.qiye.163.com (mail-m12738.qiye.163.com [115.236.127.38]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 885DF19BB; Wed, 13 Sep 2023 02:52:09 -0700 (PDT) Received: from [10.128.10.193] (unknown [123.120.52.233]) by mail-m12739.qiye.163.com (Hmail) with ESMTPA id 72B584A01D2; Wed, 13 Sep 2023 17:51:35 +0800 (CST) Message-ID: <44030794-4baa-4207-af75-4c600a3626f9@sangfor.com.cn> Date: Wed, 13 Sep 2023 17:51:31 +0800 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [RFC PATCH v2] bpf: Using binary search to improve the performance of btf_find_by_name_kind To: Eduard Zingerman , Alexei Starovoitov Cc: Martin KaFai Lau , Alexei Starovoitov , Song Liu , Yonghong Song , Steven Rostedt , Masami Hiramatsu , dinghui@sangfor.com.cn, huangcun@sangfor.com.cn, bpf , LKML References: <20230909091646.420163-1-pengdonglin@sangfor.com.cn> <20ef8441084c9d5fd54f84987afa77eed7fe148e.camel@gmail.com> <035ab912d7d6bd11c54c038464795da01dbed2de.camel@gmail.com> From: pengdonglin In-Reply-To: <035ab912d7d6bd11c54c038464795da01dbed2de.camel@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWS1ZQUlXWQ8JGhUIEh9ZQVlDGEseVk8YS04aHUkZTUJDTVUTARMWGhIXJBQOD1 lXWRgSC1lBWUpJSFVKSUtVTklVSUhIWVdZFhoPEhUdFFlBWU9LSFVKSEpCSE9VSktLVUtZBg++ X-HM-Tid: 0a8a8df40bf7b212kuuu72b584a01d2 X-HM-MType: 1 X-HM-Sender-Digest: e1kMHhlZQR0aFwgeV1kSHx4VD1lBWUc6Mwg6Pww4KD1IHQ8CGCk4Pjg6 ExkKFAJVSlVKTUJPTkJDTUJNTkhLVTMWGhIXVQseFRwfFBUcFxIVOwgaFRwdFAlVGBQWVRgVRVlX WRILWUFZSklIVUpJS1VOSVVJSEhZV1kIAVlBTUxISTcG Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Wed, 13 Sep 2023 02:52:39 -0700 (PDT) On 2023/9/13 1:03, Eduard Zingerman wrote: > On Tue, 2023-09-12 at 09:40 -0700, Alexei Starovoitov wrote: >> On Tue, Sep 12, 2023 at 7:19 AM Eduard Zingerman wrote: >>> >>> On Tue, 2023-09-12 at 16:51 +0300, Eduard Zingerman wrote: >>>> On Sat, 2023-09-09 at 02:16 -0700, Donglin Peng wrote: >>>>> Currently, we are only using the linear search method to find the type id >>>>> by the name, which has a time complexity of O(n). This change involves >>>>> sorting the names of btf types in ascending order and using binary search, >>>>> which has a time complexity of O(log(n)). This idea was inspired by the >>>>> following patch: >>>>> >>>>> 60443c88f3a8 ("kallsyms: Improve the performance of kallsyms_lookup_name()"). >>>>> >>>>> At present, this improvement is only for searching in vmlinux's and >>>>> module's BTFs, and the kind should only be BTF_KIND_FUNC or BTF_KIND_STRUCT. >>>>> >>>>> Another change is the search direction, where we search the BTF first and >>>>> then its base, the type id of the first matched btf_type will be returned. >>>>> >>>>> Here is a time-consuming result that finding all the type ids of 67,819 kernel >>>>> functions in vmlinux's BTF by their names: >>>>> >>>>> Before: 17000 ms >>>>> After: 10 ms >>>>> >>>>> The average lookup performance has improved about 1700x at the above scenario. >>>>> >>>>> However, this change will consume more memory, for example, 67,819 kernel >>>>> functions will allocate about 530KB memory. >>>> >>>> Hi Donglin, >>>> >>>> I think this is a good improvement. However, I wonder, why did you >>>> choose to have a separate name map for each BTF kind? >>>> >>>> I did some analysis for my local testing kernel config and got such numbers: >>>> - total number of BTF objects: 97350 >>>> - number of FUNC and STRUCT objects: 51597 >>>> - number of FUNC, STRUCT, UNION, ENUM, ENUM64, TYPEDEF, DATASEC objects: 56817 >>>> (these are all kinds for which lookup by name might make sense) >>>> - number of named objects: 54246 >>>> - number of name collisions: >>>> - unique names: 53985 counts >>>> - 2 objects with the same name: 129 counts >>>> - 3 objects with the same name: 3 counts >>>> >>>> So, it appears that having a single map for all named objects makes >>>> sense and would also simplify the implementation, what do you think? >>> >>> Some more numbers for my config: >>> - 13241 types (struct, union, typedef, enum), log2 13241 = 13.7 >>> - 43575 funcs, log2 43575 = 15.4 >>> Thus, having separate map for types vs functions might save ~1.7 >>> search iterations. Is this a significant slowdown in practice? >> >> What do you propose to do in case of duplicates ? >> func and struct can have the same name, but they will have two different >> btf_ids. How do we store them ? >> Also we might add global vars to BTF. Such request came up several times. >> So we need to make sure our search approach scales to >> func, struct, vars. I don't recall whether we search any other kinds. >> Separate arrays for different kinds seems ok. >> It's a bit of code complexity, but it's not an increase in memory. > > Binary search gives, say, lowest index of a thing with name A, then > increment index while name remains A looking for correct kind. > Given the name conflicts info from above, 99% of times there would be > no need to iterate and in very few cases there would a couple of iterations. Yeah, I agree. > > Same logic would be necessary with current approach if different BTF > kinds would be allowed in BTF_ID_NAME_* cohorts. I figured that these > cohorts are mainly a way to split the tree for faster lookups, but > maybe that is not the main intent. Yeah, I thought it may be faster for some kinds, but I didn't perform a comparative test. > >> With 13k structs and 43k funcs it's 56k * (4 + 4) that's 0.5 Mbyte >> extra memory. That's quite a bit. Anything we can do to compress it? > > That's an interesting question, from the top of my head: > pre-sort in pahole (re-assign IDs so that increasing ID also would > mean "increasing" name), shouldn't be that difficult. Thank you, I agree. > >> Folks requested vmlinux BTF to be a module, so it's loaded on demand. >> BTF memory consumption is a concern to many. >> I think before we add these per-kind search arrays we better make >> BTF optional as a module. > >