ฉันมีแอปพลิเคชันเซิร์ฟเวอร์แบบมัลติเธรด แอปพลิเคชันนี้รับข้อมูลจากซ็อกเก็ตแล้วจัดการข้อมูลเหล่านี้ เช่น การแกะแพ็กเกจ การเพิ่มคิวข้อมูล เป็นต้น โดยมีฟังก์ชันดังนี้ ฟังก์ชันนี้ถูกเรียกบ่อยครั้ง มีคำสั่ง select และหากพบว่ามีข้อมูลก็จะเรียกใช้ฟังก์ชันนี้เพื่อรับ):
//the main function used to receive
//file data from clients
void service(void){
while(1){
....
struct timeval timeout;
timeout.tv_sec = 3;
...
ret = select(maxFd+1, &read_set, NULL, NULL, &timeout);
if (ret > 0){
//get socket from SocketsMap
//if fd in SocketsMap and its being set
//then receive data from the socket
receive_data(fd);
}
}
}
void receive_data(int fd){
const int ONE_MEGA = 1024 * 1024;
//char *buffer = new char[ONE_MEGA]; consumes much less CPU
char buffer[ONE_MEGA]; // cause high CPU
int readn = recv(fd, buffer, ONE_MEGA, 0);
//handle the data
}
ฉันพบว่าด้านบนใช้ CPU มากเกินไป - ปกติ 80% ถึง 90% แต่ถ้าฉันสร้างบัฟเฟอร์จากฮีปแทน CPU จะเหลือเพียง 14% ทำไม
[อัปเดต]
เพิ่มโค้ดเพิ่มเติม
[update2]
สิ่งที่สำคัญที่สุดคือฉันยังได้เขียนเซิร์ฟเวอร์และไคลเอนต์รับข้อมูลแบบธรรมดาอีกเครื่องหนึ่งด้วย เซิร์ฟเวอร์เพียงรับข้อมูลจากซ็อกเก็ตแล้วทิ้งไป การจัดสรรพื้นที่ทั้งสองประเภททำงานเกือบจะเหมือนกัน ไม่มีความแตกต่างในการใช้งาน CPU มากนัก ในแอปพลิเคชันเซิร์ฟเวอร์แบบมัลติเธรดที่มีปัญหา ฉันยังรีเซ็ตขนาดสแต็กกระบวนการเป็น 30M โดยใช้อาร์เรย์ยังคงส่งผลให้เกิดปัญหา แต่การจัดสรรจากฮีปจะช่วยแก้ปัญหาได้ ฉันไม่รู้ว่าทำไม
เกี่ยวกับ "sizeof(buffer)" ขอขอบคุณที่ชี้ให้เห็นสิ่งนี้ แต่ฉันมั่นใจ 100% ว่าไม่ใช่ปัญหา เพราะในแอปพลิเคชันของฉัน ฉันไม่ได้ใช้ sizeof(buffer) แต่เป็น ONE_MEGA (1024*1024) แทน .
ยังมีอีกสิ่งหนึ่งที่ต้องพูดถึงแม้ว่าฉันจะไม่แน่ใจว่ามีประโยชน์หรือไม่ก็ตาม การแทนที่อาร์เรย์ด้วยอาร์เรย์ที่เล็กกว่า เช่น "char buffer[1024] ยังช่วยลดการใช้ cpu อย่างมากอีกด้วย
[update3]
ซ็อกเก็ตทั้งหมดอยู่ในโหมดไม่ปิดกั้น
/bin/time
แสดงจำนวน pagefault ที่แตกต่างกันอย่างสม่ำเสมอสำหรับทั้งสองเวอร์ชันหรือไม่ - person Useless   schedule 29.07.2013recv
ของคุณสำหรับการทดสอบการจัดสรรแบบไดนามิกหรือไม่ หากคุณไม่ทำsizeof(buffer)
ส่งผ่านไปยังrecv
จะบอกว่าคุณต้องการอ่านsizeof(char*)
(อาจเป็น 4 หรือ 8 ไบต์) แทนที่จะเป็น 1Mb - person simonc   schedule 29.07.2013