아래의 코드가 작동합니다. 올바른 데이터를 모두 전송하고 있으며 올바른 데이터를 수신하고 있습니다.왜 이러한 벤치 마크 코드는 높은 CPU를 사용합니까?
매우 빠른 서버를 벤치 마크 할 때 벤치 마크의 CPU 사용량은 ~ 10 %입니다. 그러나 느린 서버를 벤치마킹 할 때 ~ 50 %로 상승합니다. 서버 벤치마킹/스트레스 테스트 *와 동일합니다.
그게 무슨 일이냐고 top
님의보고입니다.
왜 CPU를 많이 사용합니까? 나는 여론 조사를 잘못하고 있다고 생각하지만 어떻게 확신 할 수 없습니까?
느린 서버의 CPU 시간은 벤치 마크의 4 배이며 빠른 서버의 경우 벤치 마크의 7 배입니다.
int flags = fcntl(sockfd, F_GETFL, 0);
assert(flags != -1);
assert(fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) != -1);
int32 red = 0;
struct pollfd pollfd = {
.fd = sockfd,
.events = POLLIN | POLLOUT
};
do {
assert(poll(&pollfd, 1, -1) == 1);
if (pollfd.revents & POLLOUT) {
int n;
while ((n = send(sockfd, buf__+bufOffset, bufLength-bufOffset, MSG_NOSIGNAL)) > 0) {
bufOffset += n;
if (n != bufLength-bufOffset)
break;
}
assert(!(n == -1 && errno != EAGAIN && errno != EWOULDBLOCK));
}
if (pollfd.revents & POLLIN) {
int r;
while ((r = read(sockfd, recvBuf, MIN(recvLength-red, recvBufLength))) > 0) {
// assert(memcmp(recvBuf, recvExpectedBuf+red, r) == 0);
red += r;
if (r != MIN(recvLength-red, recvBufLength))
break;
}
assert(!(r == -1 && errno != EAGAIN && errno != EWOULDBLOCK));
}
} while (bufOffset < bufLength);
assert(fcntl(sockfd, F_SETFL, flags & ~O_NONBLOCK) != -1);
int r;
while ((r = read(sockfd, recvBuf, MIN(recvLength-red, recvBufLength))) > 0) {
// assert(memcmp(recvBuf, recvExpectedBuf+red, r) == 0);
red += r;
}
assert(fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) != -1);
assert(red == recvLength);
int r = read(sockfd, recvBuf, 1);
assert((r == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) || r == 0);
*는 (나는 지금, 동일한 시스템에서 모두 벤치 마크 및 서버를 실행하고 있습니다. 통신은 TCP 이상입니다.)
나는 정말로 그 질문을 이해하지 못한다 ... 만약 당신이 더 강력한 컴퓨터를 가지고 있다면, 그것은 로우 엔드 컴퓨터보다 대용량 데이터를 더 쉽게 처리 할 것임이 분명하다. 어느 것이 끝날 수 있는가? "고성능"컴퓨터에서 더 빨리 끝내거나 "한 번"으로 끝내지 만 낮은 성능에서는 더 많은 CPU를 사용한다. – Reinherd
@ SergiCastellsaguéMillán 모두 동일한 컴퓨터에 있으며 모두 동일한 CPU 코어에 있습니다."느린 서버"와 "빠른 서버"의 유일한 차이점은 하나의 코드베이스가 오버 헤드가 많은 부피가 큰 느린 코드베이스이고, 하나는 새롭고 가벼운 재 작성이라는 것입니다. – Max
전체 메시지 후에 만 서버가 응답합니까? 그렇다면 ... –