[clang-tools-extra] r368498 - clangd: use -j for background index pool

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 12 06:39:26 PDT 2019


Merged to release_90 in r368569.

On Sat, Aug 10, 2019 at 1:02 AM Sam McCall via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
>
> Author: sammccall
> Date: Fri Aug  9 16:03:32 2019
> New Revision: 368498
>
> URL: http://llvm.org/viewvc/llvm-project?rev=368498&view=rev
> Log:
> clangd: use -j for background index pool
>
> Summary:
> clangd supports a -j option to limit the amount of threads to use for parsing
> TUs. However, when using -background-index (the default in later versions of
> clangd), the parallelism used by clangd defaults to the hardware_parallelisn,
> i.e. number of physical cores.
>
> On shared hardware environments, with large projects, this can significantly
> affect performance with no way to tune it down.
>
> This change makes the -j parameter apply equally to parsing and background
> index. It's not perfect, because the total number of threads is 2x the -j value,
> which may still be unexpected. But at least this change allows users to prevent
> clangd using all CPU cores.
>
> Reviewers: kadircet, sammccall
>
> Reviewed By: sammccall
>
> Subscribers: javed.absar, jfb, sammccall, ilya-biryukov, MaskRay, jkorous, arphaman, cfe-commits
>
> Tags: #clang
>
> Differential Revision: https://reviews.llvm.org/D66031
>
> Modified:
>     clang-tools-extra/trunk/clangd/ClangdServer.cpp
>     clang-tools-extra/trunk/clangd/TUScheduler.cpp
>     clang-tools-extra/trunk/clangd/tool/ClangdMain.cpp
>
> Modified: clang-tools-extra/trunk/clangd/ClangdServer.cpp
> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdServer.cpp?rev=368498&r1=368497&r2=368498&view=diff
> ==============================================================================
> --- clang-tools-extra/trunk/clangd/ClangdServer.cpp (original)
> +++ clang-tools-extra/trunk/clangd/ClangdServer.cpp Fri Aug  9 16:03:32 2019
> @@ -40,9 +40,11 @@
>  #include "llvm/Support/FileSystem.h"
>  #include "llvm/Support/Path.h"
>  #include "llvm/Support/raw_ostream.h"
> +#include <algorithm>
>  #include <future>
>  #include <memory>
>  #include <mutex>
> +#include <type_traits>
>
>  namespace clang {
>  namespace clangd {
> @@ -117,8 +119,7 @@ ClangdServer::ClangdServer(const GlobalC
>                       : nullptr),
>        GetClangTidyOptions(Opts.GetClangTidyOptions),
>        SuggestMissingIncludes(Opts.SuggestMissingIncludes),
> -      TweakFilter(Opts.TweakFilter),
> -      WorkspaceRoot(Opts.WorkspaceRoot),
> +      TweakFilter(Opts.TweakFilter), WorkspaceRoot(Opts.WorkspaceRoot),
>        // Pass a callback into `WorkScheduler` to extract symbols from a newly
>        // parsed file and rebuild the file index synchronously each time an AST
>        // is parsed.
> @@ -144,7 +145,8 @@ ClangdServer::ClangdServer(const GlobalC
>      BackgroundIdx = llvm::make_unique<BackgroundIndex>(
>          Context::current().clone(), FSProvider, CDB,
>          BackgroundIndexStorage::createDiskBackedStorageFactory(
> -            [&CDB](llvm::StringRef File) { return CDB.getProjectInfo(File); }));
> +            [&CDB](llvm::StringRef File) { return CDB.getProjectInfo(File); }),
> +        std::max(Opts.AsyncThreadsCount, 1u));
>      AddIndex(BackgroundIdx.get());
>    }
>    if (DynamicIdx)
>
> Modified: clang-tools-extra/trunk/clangd/TUScheduler.cpp
> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/TUScheduler.cpp?rev=368498&r1=368497&r2=368498&view=diff
> ==============================================================================
> --- clang-tools-extra/trunk/clangd/TUScheduler.cpp (original)
> +++ clang-tools-extra/trunk/clangd/TUScheduler.cpp Fri Aug  9 16:03:32 2019
> @@ -54,6 +54,7 @@
>  #include "llvm/ADT/ScopeExit.h"
>  #include "llvm/Support/Errc.h"
>  #include "llvm/Support/Path.h"
> +#include "llvm/Support/Threading.h"
>  #include <algorithm>
>  #include <memory>
>  #include <queue>
> @@ -801,10 +802,10 @@ std::string renderTUAction(const TUActio
>  } // namespace
>
>  unsigned getDefaultAsyncThreadsCount() {
> -  unsigned HardwareConcurrency = std::thread::hardware_concurrency();
> -  // C++ standard says that hardware_concurrency()
> -  // may return 0, fallback to 1 worker thread in
> -  // that case.
> +  unsigned HardwareConcurrency = llvm::heavyweight_hardware_concurrency();
> +  // heavyweight_hardware_concurrency may fall back to hardware_concurrency.
> +  // C++ standard says that hardware_concurrency() may return 0; fallback to 1
> +  // worker thread in that case.
>    if (HardwareConcurrency == 0)
>      return 1;
>    return HardwareConcurrency;
>
> Modified: clang-tools-extra/trunk/clangd/tool/ClangdMain.cpp
> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/tool/ClangdMain.cpp?rev=368498&r1=368497&r2=368498&view=diff
> ==============================================================================
> --- clang-tools-extra/trunk/clangd/tool/ClangdMain.cpp (original)
> +++ clang-tools-extra/trunk/clangd/tool/ClangdMain.cpp Fri Aug  9 16:03:32 2019
> @@ -267,7 +267,8 @@ list<std::string> TweakList{
>  opt<unsigned> WorkerThreadsCount{
>      "j",
>      cat(Misc),
> -    desc("Number of async workers used by clangd"),
> +    desc("Number of async workers used by clangd. Background index also "
> +         "uses this many workers."),
>      init(getDefaultAsyncThreadsCount()),
>  };
>
> @@ -308,7 +309,8 @@ opt<PCHStorageFlag> PCHStorage{
>  opt<bool> Sync{
>      "sync",
>      cat(Misc),
> -    desc("Parse on main thread. If set, -j is ignored"),
> +    desc("Handle client requests on main thread. Background index still uses "
> +         "its own thread."),
>      init(false),
>      Hidden,
>  };
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list