YugabyteDB tserver에서 짧은 스택을 빠르게 가져옵니다.

나는 Flamegraph로 RocksDB 탐색을 위한 호출 스택을 살펴보았습니다. 어떤 이유로든 tserver 노드에서 perf를 실행할 수 있는 액세스 권한이 없으면 현재 스택이 tserver 엔드포인트에 노출됩니다:9000/threadz. 다음은 60초 동안 샘플링하고 yb::tserver::PerformRead에서 rocksdb::DBIter::Seek()까지의 호출만 유지하고 각각에 대한 샘플 수와 함께 다른 코드 경로를 표시하는 빠른 스크립트입니다.

end=$(( $SECONDS + 60 ))
while [ $SECONDS -lt $end ]
do
curl -Ls http://$(hostname):9000/threadz?group=rpc_thread_pool | awk '
/rocksdb::DBIter::Seek/,/yb::tserver::PerformRead/{
 sub(/^.* 0x[^ ]+ */,"")
 sub(/[<][/].*/,"")
 stack=$0" @ "stack
}/Total number of threads/ && stack!=""{
 #print NF" samples of:\t"stack
 samples[stack]=samples[stack]+NF
 stack=""
}
END{
 for (i in samples) print samples[i]" samples of: @ "i
}'
done | sort -n | uniq -c | awk '
{ $1=$1+$2;$2="" ; print }
' | sort -n | sed -e 's/ @/\n/g'



Index Scan Backwards에 대한 이전 블로그 게시물과 동일한 실행에 대한 출력은 다른PerformRocksDBSeek 호출을 보여줍니다.

9  samples of:
 yb::tserver::PerformRead()
 yb::tserver::(anonymous namespace)::ReadQuery::Complete()
 yb::tablet::Tablet::HandlePgsqlReadRequest()
 yb::tablet::AbstractTablet::ProcessPgsqlReadRequest()
 yb::docdb::PgsqlReadOperation::Execute()
 yb::docdb::PgsqlReadOperation::ExecuteScalar()
 yb::docdb::(anonymous namespace)::CreateIterator()
 yb::docdb::QLRocksDBStorage::GetIterator()
 yb::docdb::DocRowwiseIterator::Init()
 yb::docdb::IntentAwareIterator::PreparePrev()
 yb::docdb::PerformRocksDBSeek()
 rocksdb::DBIter::Seek()

30  samples of:
 yb::tserver::PerformRead()
 yb::tserver::(anonymous namespace)::ReadQuery::Complete()
 yb::tablet::Tablet::HandlePgsqlReadRequest()
 yb::tablet::AbstractTablet::ProcessPgsqlReadRequest()
 yb::docdb::PgsqlReadOperation::Execute()
 yb::docdb::PgsqlReadOperation::ExecuteScalar()
 yb::docdb::DocRowwiseIterator::HasNext()
 yb::docdb::DocDBTableReader::Get()
 yb::docdb::IntentAwareIterator::SeekForward()
 yb::docdb::IntentAwareIterator::SeekForwardRegular()
 yb::docdb::PerformRocksDBSeek()
 rocksdb::DBIter::Seek()

61  samples of:
 yb::tserver::PerformRead()
 yb::tserver::(anonymous namespace)::ReadQuery::Complete()
 yb::tablet::Tablet::HandlePgsqlReadRequest()
 yb::tablet::AbstractTablet::ProcessPgsqlReadRequest()
 yb::docdb::PgsqlReadOperation::Execute()
 yb::docdb::PgsqlReadOperation::ExecuteScalar()
 yb::docdb::DocRowwiseIterator::HasNext()
 yb::docdb::DocRowwiseIterator::AdvanceIteratorToNextDesiredRow()
 yb::docdb::IntentAwareIterator::SeekToLatestDocKeyInternal()
 yb::docdb::IntentAwareIterator::Seek()
 yb::docdb::PerformRocksDBSeek()
 rocksdb::DBIter::Seek()

72  samples of:
 yb::tserver::PerformRead()
 yb::tserver::(anonymous namespace)::ReadQuery::Complete()
 yb::tablet::Tablet::HandlePgsqlReadRequest()
 yb::tablet::AbstractTablet::ProcessPgsqlReadRequest()
 yb::docdb::PgsqlReadOperation::Execute()
 yb::docdb::PgsqlReadOperation::ExecuteScalar()
 yb::docdb::DocRowwiseIterator::HasNext()
 yb::docdb::DocRowwiseIterator::AdvanceIteratorToNextDesiredRow()
 yb::docdb::IntentAwareIterator::PreparePrev()
 yb::docdb::PerformRocksDBSeek()
 rocksdb::DBIter::Seek()


이 예에서는 yb::tserver::PerformRead()에서 제공하고 rocksdb_number_db_seek에서 증가하는 rocksdb::DBIter::Seek()에서 읽기(Index Scan Backward가 있는 SELECT)를 실행하고 있었습니다. 이것이 제가 이러한 탐색으로 가는 스택에 관심을 갖게 된 이유입니다. 이 짧은 샘플에서 나는 행당 2개의 검색에 대한 이유를 볼 수 있습니다. 하나는 이전 키로 이동하는 것이고AdvanceIteratorToNextDesiredRow 다른 하나는 올바른 읽기 시간으로 이동하는 것입니다.

좋은 웹페이지 즐겨찾기