mirror of
https://github.com/apple/foundationdb.git
synced 2025-05-14 09:58:50 +08:00
Use absl::GetStackTrace for slow task profiler (#7374)
* Make SlowTask workload runnable in joshua * Remove SignalSafeUnwind, and use absl::GetStackTrace for slow task profiler
This commit is contained in:
parent
0fea3fb731
commit
83aceb216c
@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#include "contrib/fmt-8.1.1/include/fmt/format.h"
|
#include "contrib/fmt-8.1.1/include/fmt/format.h"
|
||||||
#include "fdbserver/workloads/workloads.actor.h"
|
#include "fdbserver/workloads/workloads.actor.h"
|
||||||
#include "flow/SignalSafeUnwind.h"
|
|
||||||
#include "flow/actorcompiler.h" // This must be the last #include.
|
#include "flow/actorcompiler.h" // This must be the last #include.
|
||||||
|
|
||||||
// Stress test the slow task profiler or flow profiler
|
// Stress test the slow task profiler or flow profiler
|
||||||
@ -43,24 +42,22 @@ struct SlowTaskWorkload : TestWorkload {
|
|||||||
|
|
||||||
ACTOR static Future<Void> go() {
|
ACTOR static Future<Void> go() {
|
||||||
wait(delay(1));
|
wait(delay(1));
|
||||||
int64_t phc = dl_iterate_phdr_calls;
|
|
||||||
int64_t startProfilesDeferred = getNumProfilesDeferred();
|
int64_t startProfilesDeferred = getNumProfilesDeferred();
|
||||||
int64_t startProfilesOverflowed = getNumProfilesOverflowed();
|
int64_t startProfilesOverflowed = getNumProfilesOverflowed();
|
||||||
int64_t startProfilesCaptured = getNumProfilesCaptured();
|
int64_t startProfilesCaptured = getNumProfilesCaptured();
|
||||||
int64_t exc = 0;
|
int64_t exc = 0;
|
||||||
fprintf(stderr, "Slow task starting\n");
|
fprintf(stdout, "Slow task starting\n");
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
fprintf(stderr, " %d\n", i);
|
fprintf(stdout, " %d\n", i);
|
||||||
double end = timer() + 1;
|
double end = timer() + 1;
|
||||||
while (timer() < end) {
|
while (timer() < end) {
|
||||||
do_slow_exception_thing(&exc);
|
do_slow_exception_thing(&exc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fmt::print(stderr,
|
fmt::print(stdout,
|
||||||
"Slow task complete: {0} exceptions; {1} calls to dl_iterate_phdr, {2}"
|
"Slow task complete: {0} exceptions; {1} profiles deferred, {2} profiles overflowed, {3} profiles "
|
||||||
" profiles deferred, {3} profiles overflowed, {4} profiles captured\n",
|
"captured\n",
|
||||||
exc,
|
exc,
|
||||||
dl_iterate_phdr_calls - phc,
|
|
||||||
getNumProfilesDeferred() - startProfilesDeferred,
|
getNumProfilesDeferred() - startProfilesDeferred,
|
||||||
getNumProfilesOverflowed() - startProfilesOverflowed,
|
getNumProfilesOverflowed() - startProfilesOverflowed,
|
||||||
getNumProfilesCaptured() - startProfilesCaptured);
|
getNumProfilesCaptured() - startProfilesCaptured);
|
||||||
|
@ -62,8 +62,6 @@ set(FLOW_SRCS
|
|||||||
Profiler.h
|
Profiler.h
|
||||||
ScopeExit.h
|
ScopeExit.h
|
||||||
SendBufferIterator.h
|
SendBufferIterator.h
|
||||||
SignalSafeUnwind.cpp
|
|
||||||
SignalSafeUnwind.h
|
|
||||||
SimpleOpt.h
|
SimpleOpt.h
|
||||||
StreamCipher.cpp
|
StreamCipher.cpp
|
||||||
StreamCipher.h
|
StreamCipher.h
|
||||||
|
@ -89,10 +89,6 @@ void initProfiling() {
|
|||||||
net2backtraces = new volatile void*[net2backtraces_max];
|
net2backtraces = new volatile void*[net2backtraces_max];
|
||||||
other_backtraces = new volatile void*[net2backtraces_max];
|
other_backtraces = new volatile void*[net2backtraces_max];
|
||||||
|
|
||||||
// According to folk wisdom, calling this once before setting up the signal handler makes
|
|
||||||
// it async signal safe in practice :-/
|
|
||||||
backtrace(const_cast<void**>(other_backtraces), net2backtraces_max);
|
|
||||||
|
|
||||||
sigemptyset(&sigprof_set);
|
sigemptyset(&sigprof_set);
|
||||||
sigaddset(&sigprof_set, SIGPROF);
|
sigaddset(&sigprof_set, SIGPROF);
|
||||||
}
|
}
|
||||||
|
@ -3738,7 +3738,7 @@ void profileHandler(int sig) {
|
|||||||
ps->timestamp = checkThreadTime.is_lock_free() ? checkThreadTime.load() : 0;
|
ps->timestamp = checkThreadTime.is_lock_free() ? checkThreadTime.load() : 0;
|
||||||
|
|
||||||
// SOMEDAY: should we limit the maximum number of frames from backtrace beyond just available space?
|
// SOMEDAY: should we limit the maximum number of frames from backtrace beyond just available space?
|
||||||
size_t size = backtrace(ps->frames, net2backtraces_max - net2backtraces_offset - 2);
|
size_t size = platform::raw_backtrace(ps->frames, net2backtraces_max - net2backtraces_offset - 2);
|
||||||
|
|
||||||
ps->length = size;
|
ps->length = size;
|
||||||
|
|
||||||
|
@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
* SignalSafeUnwind.cpp
|
|
||||||
*
|
|
||||||
* This source file is part of the FoundationDB open source project
|
|
||||||
*
|
|
||||||
* Copyright 2013-2022 Apple Inc. and the FoundationDB project authors
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "flow/SignalSafeUnwind.h"
|
|
||||||
|
|
||||||
int64_t dl_iterate_phdr_calls = 0;
|
|
||||||
|
|
||||||
#if defined(__linux__) && !defined(USE_SANITIZER)
|
|
||||||
|
|
||||||
#include <link.h>
|
|
||||||
#include <mutex>
|
|
||||||
|
|
||||||
static int (*chain_dl_iterate_phdr)(int (*callback)(struct dl_phdr_info* info, size_t size, void* data),
|
|
||||||
void* data) = nullptr;
|
|
||||||
|
|
||||||
static void initChain() {
|
|
||||||
static std::once_flag flag;
|
|
||||||
|
|
||||||
// Ensure that chain_dl_iterate_phdr points to the "real" function that we are overriding
|
|
||||||
std::call_once(flag, []() { *(void**)&chain_dl_iterate_phdr = dlsym(RTLD_NEXT, "dl_iterate_phdr"); });
|
|
||||||
|
|
||||||
if (!chain_dl_iterate_phdr) {
|
|
||||||
criticalError(FDB_EXIT_ERROR, "SignalSafeUnwindError", "Unable to find dl_iterate_phdr symbol");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This overrides the function in libc!
|
|
||||||
extern "C" int dl_iterate_phdr(int (*callback)(struct dl_phdr_info* info, size_t size, void* data), void* data) {
|
|
||||||
interlockedIncrement64(&dl_iterate_phdr_calls);
|
|
||||||
|
|
||||||
initChain();
|
|
||||||
|
|
||||||
setProfilingEnabled(0);
|
|
||||||
int result = chain_dl_iterate_phdr(callback, data);
|
|
||||||
setProfilingEnabled(1);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
#endif
|
|
@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
* SignalSafeUnwind.h
|
|
||||||
*
|
|
||||||
* This source file is part of the FoundationDB open source project
|
|
||||||
*
|
|
||||||
* Copyright 2013-2022 Apple Inc. and the FoundationDB project authors
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FLOW_SIGNAL_SAFE_UNWIND
|
|
||||||
#define FLOW_SIGNAL_SAFE_UNWIND
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "flow/Platform.h"
|
|
||||||
|
|
||||||
// This can be used by tests to measure the number of calls to dl_iterate_phdr intercepted
|
|
||||||
extern int64_t dl_iterate_phdr_calls;
|
|
||||||
|
|
||||||
#endif
|
|
@ -94,7 +94,7 @@ if(WITH_PYTHON)
|
|||||||
else()
|
else()
|
||||||
add_fdb_test(TEST_FILES SimpleExternalTest.txt IGNORE)
|
add_fdb_test(TEST_FILES SimpleExternalTest.txt IGNORE)
|
||||||
endif()
|
endif()
|
||||||
add_fdb_test(TEST_FILES SlowTask.txt IGNORE)
|
add_fdb_test(TEST_FILES noSim/SlowTask.txt IGNORE)
|
||||||
add_fdb_test(TEST_FILES SpecificUnitTest.txt IGNORE)
|
add_fdb_test(TEST_FILES SpecificUnitTest.txt IGNORE)
|
||||||
add_fdb_test(TEST_FILES StorageMetricsSampleTests.txt IGNORE)
|
add_fdb_test(TEST_FILES StorageMetricsSampleTests.txt IGNORE)
|
||||||
add_fdb_test(TEST_FILES WorkerTests.txt IGNORE)
|
add_fdb_test(TEST_FILES WorkerTests.txt IGNORE)
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
|
useDB=false
|
||||||
testTitle=Slow Task Stress
|
testTitle=Slow Task Stress
|
||||||
testName=SlowTaskWorkload
|
testName=SlowTaskWorkload
|
Loading…
x
Reference in New Issue
Block a user