ทำไมการโทรหากันหลายชั่วโมง


11

เหตุใดคอมโบ PHP / Apache จึงมีgettimeofdaysyscalls มากมาย แม้ว่าการโทรรวดเร็วทุกครั้งจะเป็นการโทรที่ควรคำนึงถึง

เพียงแค่รวดเร็วstrace -c -p [apache2 process id]ให้สิ่งต่อไปนี้:

Process 22294 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 98.52    0.010000          51       196           poll
  1.48    0.000150           0     20752           gettimeofday
  0.00    0.000000           0        94         7 read
  0.00    0.000000           0        48           write
  0.00    0.000000           0        96        32 open
  0.00    0.000000           0        75           close
  0.00    0.000000           0         6           chdir
  0.00    0.000000           0       766           time
  0.00    0.000000           0         2           chmod
  0.00    0.000000           0        56        10 access

20K สายเหล่านั้นทำให้ฉันเป็นกังวล ใครสนใจที่จะหลั่งน้ำตาแสงนี้


Java เป็นยิ่งแย่ลง ...
นิลส์

โปรแกรมของคุณกำลังทำอะไร
Michael Hampton

1
ฉันไม่สามารถตอบ "ทำไม" แต่คุณรู้หรือไม่ว่าstackoverflow.com/questions/7266813/และaccess.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_MRG/ ...... ? โดยทั่วไป syscall จะถูกแมปกับรหัสพื้นที่ผู้ใช้ ("vsyscall") ดังนั้นค่าใช้จ่ายจะลดลงอย่างมาก
the-wabbit

1
การนับไม่ควรกังวลคุณ โพลมีการโทรเพียง 200 ครั้ง แต่ใช้มากกว่า 98% ของเวลาทั้งหมด คุณสามารถสลับไปที่เอาต์พุต strace ปกติจากนั้นคุณจะเห็นว่า apache กำลังทำอะไร (จะทำให้ช้าลงมาก ๆ )
ott--

3
ที่เกี่ยวข้อง: blog.packagecloud.io/eng/2017/03/08/…
Michael Hampton

คำตอบ:


4

Gettimeofday ส่วนใหญ่ถูกเรียกโดย Apache เพื่อบันทึกรายการในไฟล์ debug นอกจากนี้บางโมดูลใช้ gettimeofday ดังนั้นไม่มีอะไรต้องกังวล

แก้ไข: ฉันทำการขุดซอร์สโค้ด PHP และสร้างผลลัพธ์ต่อไปนี้: เวลาส่วนใหญ่ฟังก์ชั่นที่เกี่ยวข้องกับ PHP จะใช้เวลาของระบบ เนื่องจากพวกเขาใช้เวลาของระบบ gettimeofday จะถูกเรียกมากดังนั้นหากคุณต้องการลดการโทรให้ลดการใช้เวลาของคุณที่เกี่ยวข้องกับฟังก์ชั่น

ฉันต้องตั้งข้อสังเกตว่าฟังก์ชั่นอื่น ๆ ก็ใช้งานได้เช่นกัน ตัวอย่างเช่นถ้าคุณใช้ php_session_start สิ่งนี้จะ (บางครั้งขึ้นอยู่กับพารามิเตอร์บางอย่างเช่นถ้าเซสชันใหม่, ... ) โทรไปที่ php_combined_lcg ซึ่งจะทำให้ในทางของเขาโทรไป lcg_seed หากไม่มีการตั้งค่าเมล็ด รับตัวเลขสุ่มหลอก และ lcg_seed จะโทรหาเวลาพักผ่อนทุกวัน จำไว้ในใจ


แต่ถ้าสคริปต์ PHP ของ CLI ของฉันโทรออกเป็นจำนวนมาก มีบางอย่างผิดปกติกับ PHP ของฉัน? (เช่น ie date () หรือ mktime () ใช้ฟังก์ชั่นเหล่านั้นถ้าฉันไม่ได้ระบุเวลาเป็น param หรือไม่?)
Gekkie

ค้นหานิดหน่อยและแก้ไขคำตอบของฉัน
timmeyh

ขอบคุณ ... ฉันคิดว่าฉันต้องอยู่กับการโทรเหล่านั้นทั้งหมด :)
Gekkie

หากคุณxdebugติดตั้งแล้วมันอาจเป็นผลพลอยได้จากมันได้
B00MER

1

ฉันได้ค้นพบว่ามีโมดูล php, xdebug เปิดใช้งานทำให้ strace รายงานการgettimeofdayโทรหลายครั้ง


1

ทุกกระบวนการที่ต้องใช้การประทับเวลาเรียก gettimeofday ดังนั้นจึงเป็นการยากที่จะรู้ว่ามันเป็นเรื่องปกติหรือไม่

ตัวอย่างเช่นอาจเป็นโมดูลที่สร้างบันทึกซึ่งเป็นโมดูลที่ตรวจสอบเวลา ... ในความเป็นจริงในกรณีของคุณเพื่อทราบว่าเหตุใดจึงมี gettimeofday มากมายให้ปิดใช้งานโมดูล apache ที่อาจรับผิดชอบในการเรียกใช้ gettimeofday อาจมีการเขียนไฟล์บันทึกจำนวนมากเกินไปในโฟลเดอร์ต่างๆ

  • ปิดใช้งานผู้ต้องสงสัยปกติเช่น mod_log_debug หรือ mod_status
  • โหลดการกำหนดค่าใหม่ของ Apache
  • strace
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.