mirror of
https://github.com/MariaDB/server.git
synced 2026-05-07 23:54:31 +02:00
Fixed a bug in the ndbd scheduler with send of packed signals.
Fixing this bugs improves performance by 40% for very small read statements and with 12-13 % for very simple updating transactions (flexBench -o 10000) in single threaded application. Removes a fixed cost of around 100.000 cycles every time the ndbd process wakes up to execute some queries. ndb/src/kernel/vm/FastScheduler.cpp: Integrate sendPacked into doJob The lack of integration meant that several loops in ipControlLoop were executed each time the ndbd process woke up, also for reads it meant that response was divided in two TCP/IP packets Is necessary to integrate this with overload protection ndb/src/kernel/vm/ThreadConfig.cpp: Integrate sendPacked into doJob The lack of integration meant that several loops in ipControlLoop were executed each time the ndbd process woke up, also for reads it meant that response was divided in two TCP/IP packets Is necessary to integrate this with overload protection
This commit is contained in:
parent
4faf77a9fe
commit
0a507d2cf1
2 changed files with 22 additions and 14 deletions
|
|
@ -76,19 +76,26 @@ FastScheduler::activateSendPacked()
|
|||
globalData.loopMax = 2048;
|
||||
}//FastScheduler::activateSendPacked()
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// sendPacked is executed at the end of the loop.
|
||||
// To ensure that we don't send any messages before executing all local
|
||||
// packed signals we do another turn in the loop (unless we have already
|
||||
// executed too many signals in the loop).
|
||||
//------------------------------------------------------------------------
|
||||
void
|
||||
FastScheduler::doJob()
|
||||
{
|
||||
Uint32 init_loopCount = 0;
|
||||
Uint32 TminLoops = getBOccupancy() + EXTRA_SIGNALS_PER_DO_JOB;
|
||||
Uint32 TloopMax = (Uint32)globalData.loopMax;
|
||||
if (TminLoops < TloopMax) {
|
||||
TloopMax = TminLoops;
|
||||
}//if
|
||||
if (TloopMax < MIN_NUMBER_OF_SIG_PER_DO_JOB) {
|
||||
TloopMax = MIN_NUMBER_OF_SIG_PER_DO_JOB;
|
||||
}//if
|
||||
do{
|
||||
Uint32 loopCount = 0;
|
||||
Uint32 TminLoops = getBOccupancy() + EXTRA_SIGNALS_PER_DO_JOB;
|
||||
Uint32 TloopMax = (Uint32)globalData.loopMax;
|
||||
if (TminLoops < TloopMax) {
|
||||
TloopMax = TminLoops;
|
||||
}//if
|
||||
if (TloopMax < MIN_NUMBER_OF_SIG_PER_DO_JOB) {
|
||||
TloopMax = MIN_NUMBER_OF_SIG_PER_DO_JOB;
|
||||
}//if
|
||||
Uint32 loopCount = init_loopCount;
|
||||
register Uint32 tHighPrio = globalData.highestAvailablePrio;
|
||||
register Signal* signal = getVMSignals();
|
||||
while ((tHighPrio < LEVEL_IDLE) && (loopCount < TloopMax)) {
|
||||
|
|
@ -151,7 +158,7 @@ FastScheduler::doJob()
|
|||
if (globalData.sendPackedActivated == 1) {
|
||||
Uint32 t1 = theDoJobTotalCounter;
|
||||
Uint32 t2 = theDoJobCallCounter;
|
||||
t1 += loopCount;
|
||||
t1 += (loopCount - init_loopCount);
|
||||
t2++;
|
||||
theDoJobTotalCounter = t1;
|
||||
theDoJobCallCounter = t2;
|
||||
|
|
@ -161,7 +168,11 @@ FastScheduler::doJob()
|
|||
theDoJobTotalCounter = 0;
|
||||
}//if
|
||||
}//if
|
||||
} while (getBOccupancy() > MAX_OCCUPANCY);
|
||||
init_loopCount = loopCount;
|
||||
sendPacked();
|
||||
} while ((getBOccupancy() > MAX_OCCUPANCY) ||
|
||||
((init_loopCount < TloopMax) &&
|
||||
(globalData.highestAvailablePrio < LEVEL_IDLE)));
|
||||
}//FastScheduler::doJob()
|
||||
|
||||
void FastScheduler::sendPacked()
|
||||
|
|
|
|||
|
|
@ -173,9 +173,6 @@ void ThreadConfig::ipControlLoop()
|
|||
// until all buffers are empty or until we have executed 2048 signals.
|
||||
//--------------------------------------------------------------------
|
||||
globalScheduler.doJob();
|
||||
|
||||
globalScheduler.sendPacked();
|
||||
|
||||
}//while
|
||||
|
||||
globalData.incrementWatchDogCounter(6);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue