โหลดเฉลี่ยสูงใช้งาน CPU ต่ำ - ทำไม


78

เราพบปัญหาประสิทธิภาพการทำงานขนาดใหญ่บนเว็บแอปพลิเคชันและเรากำลังพยายามหาคอขวด ฉันไม่ใช่ผู้ดูแลระบบดังนั้นจึงมีบางสิ่งที่ฉันไม่ได้รับ การตรวจสอบขั้นพื้นฐานบางอย่างแสดงให้เห็นว่า CPU ไม่ได้ใช้งานมีหน่วยความจำจำนวนมากที่พร้อมใช้งานไม่มีการสลับไม่มี I / O แต่มีการโหลดเฉลี่ยสูง

สแต็กซอฟต์แวร์บนเซิร์ฟเวอร์นี้มีลักษณะดังนี้:

  • โซลาริส 10
  • Java 1.6
  • WebLogic 10.3.5 (8 โดเมน)

แอปพลิเคชันที่ทำงานบนเซิร์ฟเวอร์นี้จะพูดคุยกับฐานข้อมูล Oracle บนเซิร์ฟเวอร์อื่น

เซิร์ฟเวอร์นี้มี RAM 32GB และ 10 ซีพียู (ฉันคิดว่า)

การวิ่งprstat -Zให้อะไรแบบนี้

   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
  3836 ducm0101 2119M 2074M cpu348  58    0   8:41:56 0.5% java/225
 24196 ducm0101 1974M 1910M sleep   59    0   4:04:33 0.4% java/209
  6765 ducm0102 1580M 1513M cpu330   1    0   1:21:48 0.1% java/291
 16922 ducm0102 2115M 1961M sleep   58    0   6:37:08 0.0% java/193
 18048 root     3048K 2440K sleep   59    0   0:06:02 0.0% sa_comm/4
 26619 ducm0101 2588M 2368M sleep   59    0   8:21:17 0.0% java/231
 19904 ducm0104 1713M 1390M sleep   59    0   1:15:29 0.0% java/151
 27809 ducm0102 1547M 1426M sleep   59    0   0:38:19 0.0% java/186
  2409 root       15M   11M sleep   59    0   0:00:00 0.0% pkgserv/3
 27204 root       58M   54M sleep   59    0   9:11:38 0.0% stat_daemon/1
 27256 root       12M 8312K sleep   59    0   7:16:40 0.0% kux_vmstat/1
 29367 root      297M  286M sleep   59    0  11:02:13 0.0% dsmc/2
 22128 root       13M 6768K sleep   59    0   0:10:51 0.0% sendmail/1
 22133 smmsp      13M 1144K sleep   59    0   0:01:22 0.0% sendmail/1
 22003 root     5896K  240K sleep   59    0   0:00:01 0.0% automountd/2
 22074 root     4776K 1992K sleep   59    0   0:00:19 0.0% sshd/1
 22005 root     6184K 2728K sleep   59    0   0:00:31 0.0% automountd/2
 27201 root     6248K  344K sleep   59    0   0:00:01 0.0% mount_stat/1
 20964 root     2912K  160K sleep   59    0   0:00:01 0.0% ttymon/1
 20947 root     1784K  864K sleep   59    0   0:02:22 0.0% utmpd/1
 20900 root     3048K  608K sleep   59    0   0:00:03 0.0% ttymon/1
 20979 root       77M   18M sleep   59    0   0:14:13 0.0% inetd/4
 20849 daemon   2856K  864K sleep   59    0   0:00:03 0.0% lockd/2
 17794 root       80M 1232K sleep   59    0   0:06:19 0.0% svc.startd/12
 17645 root     3080K  728K sleep   59    0   0:00:12 0.0% init/1
 17849 root       13M 6800K sleep   59    0   0:13:04 0.0% svc.configd/15
 20213 root       84M   81M sleep   59    0   0:47:17 0.0% nscd/46
 20871 root     2568K  600K sleep   59    0   0:00:04 0.0% sac/1
  3683 ducm0101 1904K 1640K sleep   56    0   0:00:00 0.0% startWebLogic.s/1
 23937 ducm0101 1904K 1640K sleep   59    0   0:00:00 0.0% startWebLogic.s/1
 20766 daemon   5328K 1536K sleep   59    0   0:00:36 0.0% nfsmapid/3
 20141 daemon   5968K 3520K sleep   59    0   0:01:14 0.0% kcfd/4
 20093 ducm0101 2000K  376K sleep   59    0   0:00:01 0.0% pfksh/1
 20797 daemon   3256K  240K sleep   59    0   0:00:01 0.0% statd/1
  6181 root     4864K 2872K sleep   59    0   0:01:34 0.0% syslogd/17
  7220 ducm0104 1268M 1101M sleep   59    0   0:36:35 0.0% java/138
 27597 ducm0102 1904K 1640K sleep   59    0   0:00:00 0.0% startWebLogic.s/1
 27867 root       37M 4568K sleep   59    0   0:13:56 0.0% kcawd/7
 12685 ducm0101 4080K  208K sleep   59    0   0:00:01 0.0% vncconfig/1
ZONEID    NPROC  SWAP   RSS MEMORY      TIME  CPU ZONE
    42      135   22G   19G    59%  87:27:59 1.2% dsuniucm01

Total: 135 processes, 3167 lwps, load averages: 54.48, 62.50, 63.11

ฉันเข้าใจว่า CPU ส่วนใหญ่ไม่ได้ใช้งาน แต่ค่าเฉลี่ยการโหลดสูงซึ่งค่อนข้างแปลกสำหรับฉัน ดูเหมือนว่าหน่วยความจำจะไม่เป็นปัญหา

การวิ่งvmstat 15ให้อะไรแบบนี้

 kthr      memory            page            disk          faults      cpu
 r b w   swap  free  re  mf pi po fr de sr s0 s1 s4 sd   in   sy   cs us sy id
 0 0 0 32531400 105702272 317 1052 126 0 0 0 0 13 13 -0 8 9602 107680 10964 1 1 98
 0 0 0 15053368 95930224 411 2323 0 0 0 0 0 0  0  0  0 23207 47679 29958 3 2 95
 0 0 0 14498568 95801960 3072 3583 0 2 2 0 0 3 3  0 21 22648 66367 28587 4 4 92
 0 0 0 14343008 95656752 3080 2857 0 0 0 0 0 3 3  0 18 22338 44374 29085 3 4 94
 0 0 0 14646016 95485472 1726 3306 0 0 0 0 0 0 0  0  0 24702 47499 33034 3 3 94

ฉันเข้าใจว่า CPU ส่วนใหญ่ไม่มีการใช้งานไม่มีกระบวนการใดที่รอคิวเพื่อดำเนินการการแลกเปลี่ยนเกิดขึ้นเล็กน้อย

การวิ่งiostat 15ให้สิ่งนี้:

   tty        sd0           sd1           sd4           ssd0           cpu
 tin tout kps tps serv  kps tps serv  kps tps serv  kps tps serv   us sy wt id
   0  676 324  13    8  322  13    8    0   0    0  159   8    0    1  1  0 98
   1 1385   0   0    0    0   0    0    0   0    0    0   0    0    3  4  0 94
   0  584  89   6   24   89   6   25    0   0    0  332  19    0    2  1  0 97
   0  296   0   0    0    0   0    0    0   0    0    0   0    0    2  2  0 97
   1 1290  43   5   24   43   5   22    0   0    0  297  20    1    3  3  0 94

การวิ่งnetstat -i 15ให้สิ่งต่อไปนี้:

    input   aggr26    output       input  (Total)    output
packets errs  packets errs  colls  packets errs  packets errs  colls
1500233798 0     1489316495 0     0      3608008314 0     3586173708 0     0
10646   0     10234   0     0      26206   0     25382   0     0
11227   0     10670   0     0      28562   0     27448   0     0
10353   0     9998    0     0      29117   0     28418   0     0
11443   0     12003   0     0      30385   0     31494   0     0

ฉันพลาดอะไรไป


ฉันไม่ได้อยู่ที่บ้านกับ Solaris ดังนั้นฉันจะฝากคนอื่นให้ทำสิ่งนี้ แต่ฉันจะเริ่มดูการกำหนดค่าเว็บเซิร์ฟเวอร์ของคุณ บางทีบางสิ่งอาจทำให้ประสิทธิภาพการทำงานผิดเพี้ยนไปในลักษณะที่ทำให้เธรดจำนวนมากอยู่ในคิวการรัน (ไม่แน่ใจว่าสิ่งนั้นอาจเป็นหรือเป็นไปได้แม้ว่า) ความรุ่งโรจน์สำหรับคำถามที่เขียนดีแม้ว่า
SmallClanger

4
10 ซีพียู (ฉันคิดว่า)อาจเป็นปัญหา คุณควรรู้อย่างถ่องแท้ว่าฮาร์ดแวร์ใดที่คุณใช้อยู่ก่อนที่จะทำการตรวจสอบเพิ่มเติม ใช้psrinfo -vเพื่อแสดงจำนวน CPU ที่แท้จริง
jlliagre

ฉันไม่เคยได้ยินคำสั่งนี้ แต่เมื่อเรียกใช้ดูเหมือนว่ามีโปรเซสเซอร์เสมือนประมาณ 250 ตัว นั่นมันสมเหตุสมผลไหม ในกรณีนี้ค่าเฉลี่ยการโหลด 50 จะไม่มีนัยสำคัญหรือไม่?
Spiff

ฉันคิดว่าสิ่งนี้อาจเกิดขึ้นได้เมื่อดิสก์ของคุณเต็ม ฉันมีสิ่งนี้ในวันนี้ด้วยพื้นที่ว่าง 1% /และโหลดเพิ่มขึ้นเรื่อย ๆ จนกระทั่ง19.00ไม่มีเหตุผลที่ชัดเจน การทำให้ที่ว่างบางส่วนสามารถแก้ไขปัญหาได้ (ไม่นานหลังจากที่ลงมา) อาจเป็นเรื่องบังเอิญได้เช่นกัน
nh2

คำตอบ:


40

จากการตรวจสอบเพิ่มเติมพบว่าปัญหาด้านประสิทธิภาพส่วนใหญ่เกิดจากการเรียกเครือข่ายจำนวนมากระหว่างสองระบบ (Oracle SSXA และ UCM) การโทรนั้นรวดเร็ว แต่มีมากและต่อเนื่องดังนั้นการใช้งาน CPU ต่ำ (ส่วนใหญ่จะรอ I / O), การโหลดเฉลี่ยสูง (การโทรจำนวนมากที่รอการประมวลผล) และโดยเฉพาะอย่างยิ่งเวลาตอบสนองที่นาน

ขอบคุณสำหรับข้อมูลเชิงลึกเกี่ยวกับปัญหานี้!


4
คุณยืนยันและหาวิธีนี้ได้อย่างไร เราจะเห็นปัญหาเดียวกันและต้องการที่จะตรวจสอบว่าเรามีปัญหาเดียวกัน
หลอกเด็ก

32

เมื่อคุณพูดว่า 'โหลดสูงเฉลี่ย' ฉันถือว่าคุณหมายความว่า prstat แสดงสำหรับ 'โหลดเฉลี่ย' ที่ด้านล่างของตัวเลขผลลัพธ์ของ

Total: 135 processes, 3167 lwps, load averages: 54.48, 62.50, 63.11

ตัวเลขเหล่านี้มีลักษณะคล้ายกับตัวเลขที่อยู่ด้านบนให้และอาจหมายถึงขนาดคิวเฉลี่ยของกระบวนการทำงาน นี่ไม่ใช่เปอร์เซ็นต์ของเวลาตัวประมวลผลที่ใช้ แต่จำนวนของ 'สิ่ง' ที่ก่อกวน CPU สำหรับเวลาในการทำงาน เป็นที่ยอมรับว่าสิ่งเหล่านี้มีลักษณะค่อนข้างสูง แต่ทั้งหมดนี้ขึ้นอยู่กับแอพที่คุณใช้งาน กระบวนการอาจไม่ได้ทำจริงมากเมื่อพวกเขาได้รับสล็อตของพวกเขา ดูที่นี่สำหรับคำอธิบายที่ดีเกี่ยวกับด้านบน

ฉันไม่คุ้นเคยกับ WebLogic แต่ฉันสังเกตว่าโดยทั่วไปกับ Apache Tomcat หลาย ๆ เธรด Java สามารถวางไข่พร้อมกันสำหรับสิ่งที่ปรากฏเป็นคำขอไม่มาก อาจเป็นไปได้ว่าสิ่งนี้เป็นสาเหตุของจำนวนภาระเฉลี่ยที่สูง ตรวจสอบให้แน่ใจว่าคุณใช้การรวมการเชื่อมต่อที่เหมาะสมในการเชื่อมต่อกับแบ็กเอนด์และพิจารณาการเพิ่มจำนวนเธรดที่ไม่ได้ใช้งานที่แอพของคุณจัดการการเชื่อมต่อ (ไม่แน่ใจว่าคุณทำเช่นนี้บน WebLogic หรือไม่; พูลเธรดตัวเรียกใช้งานทั่วไป) หากคุณไม่ทำเช่นนี้แสดงว่าเธรดใหม่เอี่ยมอาจถูกส่งไปประมวลผลคำขอ

ในเรื่องของประสิทธิภาพคุณต้องจดจ่อกับสิ่งที่แอพของคุณกำลังประสบอยู่ มันเป็นการประมวลผลที่เกิดขึ้นใน WebLogic / Java ของสิ่งต่าง ๆ การเข้าถึงฐานข้อมูลการค้นหา DNS (ถ้าพวกเขากำลังทำด้วยเหตุผลบางอย่าง ... ), ปัญหาเครือข่ายหรือบางสิ่งบางอย่างบนระบบปฏิบัติการ

99% ของเวลาที่มันเป็นโค้ดของคุณและวิธีที่มันพูดคุยกับฐานข้อมูลที่เก็บสิ่งต่าง ๆ จากนั้นจะเป็นการกำหนดค่าของเว็บแอป เมื่อผ่านจุดนี้คุณจะต้องทำงานในการบีบมิลลิวินาทีสุดท้ายออกจากแอปของคุณหรือมองหาการเห็นพ้องด้วยฮาร์ดแวร์เดียวกัน สำหรับการปรับประสิทธิภาพที่ละเอียดยิ่งขึ้นนี้คุณต้องมีการวัด

สำหรับ Java ผมขอแนะนำให้ติดตั้งJava Melody สามารถให้ข้อมูลจำนวนมากเกี่ยวกับสิ่งที่โปรแกรมของคุณกำลังทำอยู่และช่วย จำกัด ขอบเขตการใช้เวลาให้แคบลง ฉันเพิ่งใช้กับ Tomcat แต่ควรทำงานได้ดีกับ Java EE container / servlet thingy

มีหลายวิธีที่คุณสามารถปรับแต่ง Java ได้ดังนั้นให้ดูที่แนวทางการปฏิบัติงานของพวกเขา (ฉันแน่ใจว่าคุณอาจมี) และตรวจสอบให้แน่ใจว่าคุณกำลังตั้งค่า Heap Size ที่ถูกต้องและเหมาะสมกับโปรแกรมของคุณ Java Melody สามารถช่วยคุณติดตามขนาดของ heap ของ Java ที่คุณกำลังใช้งานรวมถึงวิธีที่ตัวรวบรวมขยะทำงานหนัก / ความถี่ในการขัดจังหวะโปรแกรมของคุณเพื่อล้างวัตถุ

ฉันหวังว่าจะเป็นประโยชน์ หากคุณให้ข้อมูลเพิ่มเติมฉันอาจสามารถอัปเดตคำตอบนี้และตอบสนองความต้องการของคุณได้มากขึ้น


1
ขอบคุณสำหรับคำตอบของคุณถ้าตัวแทนของฉันสูงพอที่ฉันจะถอนมัน จากรหัสประสบการณ์หรือแบบสอบถาม SQL ของฉันมักจะเป็นผู้ร้าย ฉันทำการรวบรวมข้อมูลไม่กี่ครั้งและไม่สามารถหาจุดที่น่าสนใจได้ซึ่งเป็นสาเหตุที่ฉันเริ่มดูปัจจัยพื้นฐานเพิ่มเติม ฉันจะตรวจสอบเพิ่มเติมและอัปเดตคำถามเมื่อฉันค้นหาเพิ่มเติม
Spiff

4
ฉันจะตรวจสอบผลลัพธ์ของ 'mpstat 1 5' เพื่อดูสถิติต่อโปรเซสเซอร์และดูที่คอลัมน์ "csw" และ "syscl" จาก vmstat ของคุณด้านบนดูเหมือนว่าคุณกำลังทำการโทรของระบบและสวิทช์บริบทค่อนข้างมากซึ่งดูเหมือนจะตรวจสอบความสงสัยของ webtoe ว่าคุณมีเธรดจำนวนมาก (Solaris เรียกพวกเขาว่า LWPs- กระบวนการ WeWeight) ไม่มีของพวกเขากำลังทำอะไรมากเมื่อพวกเขากำลังทำงาน แต่หลายคนกำลังรอเวลาที่จะทำงานดังนั้นค่าเฉลี่ยของการโหลดสูง
eirescot

25

ในฐานะที่เป็นบันทึกด้านค่าเฉลี่ยการโหลดยังรวมถึงสิ่งที่รอกิจกรรมดิสก์ (เช่นการล่วงละเมิดดิสก์) เช่นเดียวกับที่รอ cpu มันเป็นผลรวมของทั้งสอง ... ดังนั้นคุณอาจมีปัญหาในหนึ่งหรืออื่น ๆ

ดูhttp://en.wikipedia.org/wiki/Load_(computing) "Linux ยังรวมถึง [ในภาระเฉลี่ย] กระบวนการในสถานะสลีปที่ไม่หยุดชะงัก (โดยปกติจะรอกิจกรรมดิสก์)"

ในฐานะที่เป็นบันทึกย่อด้านปัญหาที่ฉันพบคือฉันมีโหลดเฉลี่ยสูง แต่ยังใช้งานซีพียูไม่ได้ใช้งานจำนวนมากและการใช้ดิสก์น้อย

ปรากฏว่าอย่างน้อยในกรณีของฉันบางครั้งเธรด / กระบวนการที่รอ I / O แสดงขึ้นในค่าเฉลี่ยการโหลด แต่ไม่ทำให้เกิดการเพิ่มขึ้นในคอลัมน์ "คอย" แต่พวกเขายังคง I / O ที่ถูกผูกไว้

คุณสามารถบอกได้ว่านี่เป็นกรณีที่มีรหัสต่อไปนี้ถ้าคุณเรียกใช้ใน jruby (เพียงแค่ 100 เธรดที่มี I / O แต่ละรายการ):

100.times { Thread.new { loop { File.open('big', 'w') do |f| f.seek 10_000_000_000; f.puts 'a'; end}}}

ซึ่งให้ผลลัพธ์สูงสุดดังนี้:

top - 17:45:32 up 38 days,  2:13,  3 users,  load average: 95.18, 50.29, 23.83
Tasks: 181 total,   1 running, 180 sleeping,   0 stopped,   0 zombie
Cpu(s):  3.5%us, 11.3%sy,  0.0%ni, 85.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  32940904k total, 23239012k used,  9701892k free,   983644k buffers
Swap: 34989560k total,        0k used, 34989560k free,  5268548k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
31866 packrd    18   0 19.9g  12g  11m S 117.0 41.3   4:43.85 java
  912 root      11  -5     0    0    0 S  2.0  0.0   1:40.46 kjournald

ดังนั้นคุณจะเห็นได้ว่ามันมี cpu ที่ไม่ทำงานจำนวนมาก 0.0% wa แต่มีค่าเฉลี่ยการโหลดสูงมาก

iostat ในทำนองเดียวกันแสดงดิสก์เป็นพื้นว่าง:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
       9.62    0.00    8.75    0.00    0.00   81.62

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00    49.00  0.00  6.40     0.00   221.60    69.25     0.01    0.81   0.66   0.42
sda1              0.00    49.00  0.00  6.40     0.00   221.60    69.25     0.01    0.81   0.66   0.42
sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

ดูเพิ่มเติมที่http://linuxgazette.net/141/misc/lg/tracking_load_average_issues.html

ในฐานะที่เป็นบันทึกด้านข้างเพิ่มเติมนี้ก็ดูเหมือนว่าหมายความว่า (อย่างน้อยในกรณีนี้ - วิ่ง CentOS) โหลดเฉลี่ยรวมแต่ละหัวข้อแยกต่างหากในผลรวม


2
"โหลดเฉลี่ยยังรวมถึงสิ่งที่รอคอยสำหรับการทำงานของดิสก์" บน Linuxขณะที่คำถามนี้เดิมเกี่ยวกับ Solaris ซึ่งดูเหมือนจะรวมเฉพาะการทำงานและทำงานได้ (เช่นการรอคอยสำหรับ CPU) งานในการโหลดเฉลี่ย หนึ่งรุ่น Linux ของคำถามนี้นี้
Nickolay

7

มีปัญหาเดียวกันวันนี้ หลังจากที่บางการวิจัยและการวินิจฉัยฉันตระหนักว่า VPS เล็ก ๆ ของผมก็วิ่งออกมาจากดิสก์

ในประเภทเชลล์ / พรอมต์ (Linux / Unix)

df -h

เพื่อดูดิสก์บนเครื่องของคุณ หากคุณใช้ดิสก์ที่อาจเป็นปัญหา / ปัญหา


ถ้าอย่างนั้นคุณแลกเปลี่ยนฉันคิดว่านั่นเป็นสาเหตุหรือไม่
rogerdpack

4

เครื่องมือที่มีประโยชน์อีกอย่างที่จะช่วยในสถานการณ์นี้คือ nmon

มันมีหลากหลายวิธีในการดูข้อมูลเดียวกันที่นำเสนอโดยเครื่องมืออื่น ๆ ในแพ็คเกจเล็ก ๆ

หากนี่คือเนื้อหาที่ไม่สามารถแคชได้ฉันขอแนะนำให้วางเซิร์ฟเวอร์หลายตัวไว้ด้านหลังตัวโหลดบาลานเซอร์เช่น haproxy ในโหมด tcp เพื่อกระจายโหลด


2

เพียงเพื่อเพิ่มเครื่องมือ Solaris บางตัวที่ยังไม่ได้กล่าวถึงซึ่งมีประโยชน์ในการดีบักปัญหาดังกล่าวคือ "intrstat", "mpstat" และ "lockstat" ประสบปัญหาคล้ายกันมาก่อนบนโฮสต์ที่ใช้งาน ETL จำนวนมากโหลดอย่างหนัก mpstat เปิดเผยว่ามีการขัดจังหวะจำนวนมากที่จัดการกับ I / O จำนวนมากซึ่งบ่งบอกถึงปัญหา

ในเวลานั้นบน T4-4 กับ mpstat เราเห็น vcpus ส่งเกิน 30000 อินเตอร์รัปต์ในช่วงการตรวจสอบสั้น ๆ หลังจากนั้นประสิทธิภาพเริ่มทำงาน ในกรณีนี้วิธีแก้ปัญหาเพียงอย่างเดียวคือการเพิ่มซีพียูมากขึ้นอย่างไรก็ตามงานได้ดำเนินการในภายหลังเพื่อปรับปรุงรหัส

เบรนแดนเกร็กได้เขียนเกี่ยวกับประสิทธิภาพเป็นอย่างมากโดยเฉพาะรอบ I / O ในช่วงหลายปีที่ผ่านมาและคุ้มค่ากับการค้นหาหากคุณต้องการข้อมูลเพิ่มเติม

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