ฉันเปิดตัวแอปพลิเคชันเซิร์ฟเวอร์และฉันต้องการเรียกใช้เป็นเวลานานเพื่อการทดสอบ น่าเสียดายที่ฉันลืมที่จะตั้งค่าก่อนที่ulimit -c unlimited
จะพบความผิดพลาดในที่สุดและตรวจสอบมัน มีอะไรที่ฉันสามารถทำได้ไหม
ฉันเปิดตัวแอปพลิเคชันเซิร์ฟเวอร์และฉันต้องการเรียกใช้เป็นเวลานานเพื่อการทดสอบ น่าเสียดายที่ฉันลืมที่จะตั้งค่าก่อนที่ulimit -c unlimited
จะพบความผิดพลาดในที่สุดและตรวจสอบมัน มีอะไรที่ฉันสามารถทำได้ไหม
คำตอบ:
บน Linux รุ่นล่าสุด (ตั้งแต่ 2.6.36) คุณสามารถใช้prlimit
คำสั่งและการเรียกระบบเพื่อตั้งค่าขีด จำกัด ทรัพยากรในกระบวนการโดยพลการ (ให้สิทธิ์ที่เหมาะสม):
$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION SOFT HARD UNITS
CORE max core file size unlimited unlimited blocks
คุณต้องการ util-linux-2.21 สำหรับคำสั่ง prlimit แต่คุณควรจะรวมโปรแกรมด่วนเพื่อเรียกใช้การเรียกระบบ prlimitมิฉะนั้น:
int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);
หากคุณไม่มี Linux (หรือระบบปฏิบัติการอื่น) รุ่นใหม่ที่เพียงพอสิ่งเดียวที่ฉันทราบก็คือการเชื่อมต่อกับกระบวนการgdb
และปัญหาsetrlimit
จากตัวดีบัก:
$ gdb -p $PID
...
(gdb) set $rlim = &{0ll, 0ll}
(gdb) print getrlimit(9, $rlim)
$1 = 0
(gdb) print *$rlim
$2 = {-1, -1}
(gdb) set *$rlim[0] = 1024*1024
(gdb) print setrlimit(9, $rlim)
$3 = 0
นี่คือสำหรับการตั้งค่าulimit -m
, RLIMIT_AS = 9
; เหมือนกันทุกประการสำหรับulimit -c
( RLIMIT_CORE
, ค่าตัวเลข4
บน Linux บน x86-64) สำหรับ "ไม่ จำกัด" ใช้มักจะRLIM_INFINITY
-1
คุณควรตรวจสอบใน/usr/include/bits/types.h
ขนาดที่rlim_t
เป็น; ฉันสมมติว่าlong long
(มันไม่ได้ลงนามจริง ๆ แต่การใช้ประเภทที่เซ็นชื่อทำให้ "ไม่ จำกัด " -1 อ่านง่ายขึ้น)
เนื่องจาก Ubuntu 14.04 Trusty ไม่มี util-linux-2.21 (เป็น 2.20) จึงไม่มีprlimit
คำสั่ง CLI ที่จะใช้
การใช้Python3.4 + (ซึ่งมีใน Ubuntu 14.04 และรุ่นที่ใหม่กว่า) สามารถตั้งค่าขีด จำกัด ทรัพยากรสำหรับกระบวนการที่กำลังทำงานอยู่ เรียกใช้เป็นราก:
1 ซับ:
# PID=966
# grep 'open file' /proc/$PID/limits
Max open files 1024 4096 files
# python3 -c "import resource; resource.prlimit($PID, resource.RLIMIT_NOFILE, (2048, 12345))"
# grep 'open file' /proc/$PID/limits
Max open files 2048 12345 files
หรือ verbose เพิ่มเติม:
# python3
Python 3.4.3 (default, Nov 28 2017, 16:41:13)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import resource
>>> import os
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE)
(1024, 4096)
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE, (1369, 9999))
(1024, 4096)
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE)
(1369, 9999)
ตรวจสอบว่ามันใช้งานได้:
# grep 'open file' /proc/1472/limits
Max open files 1369 9999 files
หมายเหตุทำงานได้กับ Linux 2.6.36 หรือใหม่กว่ากับ glibc 2.13 หรือใหม่กว่า
gdb
เทคนิคเจ๋งจริงๆ ข้อแม้หนึ่งดูเหมือนว่าคุณไม่สามารถเพิ่มจำนวนไฟล์ที่เปิดสำหรับกระบวนการที่ไม่ใช่รูทเกินขีด จำกัด ฮาร์ดการsetrlimit
โทรส่งคืน -1 และ errno คือ 22 (อาร์กิวเมนต์ที่ไม่ถูกต้อง)