เมื่อเร็ว ๆ นี้ Elasticsearch 5.4 (ES) เป็นเวอร์ชันที่ค่อนข้างใหม่ มีปัญหามากมายระหว่างการใช้งานซึ่งเป็นอาการปวดหัว แต่ในที่สุดปัญหาก็ถูกแก้ไข
คำถามที่ 1: Esclient ช้าและไม่สามารถรับลูกค้าได้: ไม่สามารถสร้างลูปเหตุการณ์เด็กได้
เนื่องจากธุรกิจจำเป็นต้องอัปโหลดชุดไฟล์โดยไม่ต้องอัปโหลดดัชนี ES คุณต้องรับการเชื่อมต่อแล้วทำงานทุกครั้งที่คุณเพิ่มดัชนี โดยเฉพาะอย่างยิ่งในชุดขนาดใหญ่จำนวนการซื้อกิจการมีขนาดใหญ่มาก เหตุผลหลักสำหรับปัญหานี้คือเราใช้ ES ในลูปบ่อยครั้ง ตัวอย่างเช่นเราต้องได้รับ 100 ไฟล์ในชุด เพื่อลดเวลาในการรับไคลเอนต์ ES ในที่สุดเราก็ใช้วิธีแก้ปัญหานั่นคือเริ่มต้นการเชื่อมต่อเมื่อบริการเริ่มต้นรับในครั้งเดียวแล้วเรียกมันโดยตรงในภายหลัง หลังจากอัปโหลดไฟล์แบตช์ทั้งหมดแล้วดัชนี ES จะถูกเพิ่มเข้ามาแทนที่จะเพิ่มไฟล์ทีละไฟล์ เห็นได้ชัดว่าวิธีนี้ไม่ต้องการให้แต่ละชุดได้รับการเชื่อมต่อซึ่งช่วยปรับปรุงประสิทธิภาพการดำเนินการอย่างมาก
ก่อนอื่นเมื่อบริการเริ่มต้นเราเริ่มต้นไคลเอนต์ ES แบบคงที่ในคลาสเริ่มต้น:
ElasticSearchUtil ElasticsearchUtil ส่วนตัว = ใหม่ elasticsearchutil (); ไคลเอนต์ TransportClient สาธารณะ = elasticsearchutil.getClient ();
จากนั้นเรียกมันโดยตรงเมื่อใช้:
ไคลเอนต์ไคลเอนต์ = main.client;
สิ่งนี้สามารถลดจำนวนการเชื่อมต่อกับไคลเอนต์ ES ได้อย่างมากซึ่งจะเป็นการปรับปรุงประสิทธิภาพ
รหัส ES มีดังนี้:
Public TransportClient getClient () {string [] iparr = configutil.getValue ("esip"). แยก (","); การตั้งค่าการตั้งค่า = การตั้งค่า. builder (). ใส่ ("thread_pool.generic.core", 5) .put (ค่าคงที่. esclustername, configutil.getValue ("clustername")). build (); transportClient client = ใหม่ preBuiltTransportClient (การตั้งค่า); สำหรับ (String IP: IPARR) {ที่อยู่ TransportAdDress = ใหม่ InetSocketTransportAddress (InetAddresses.forstring (IP), 9300); client.addTransportaddresses (ที่อยู่);} ส่งคืนไคลเอ็นต์;}คำถามที่ 2: หน่วยความจำล้น: java.lang.outofmemory: ไม่สามารถสร้างเธรดเนทีฟใหม่
ในระหว่างกระบวนการพัฒนาโครงการหน่วยความจำล้นเป็นสิ่งที่ลำบากมาก ฉันพบมันในระหว่างการใช้ ES และมันบ่อยมากโดยเฉพาะอย่างยิ่งในระหว่างการทดสอบความเครียดขนาดใหญ่ ฉันนึกถึงหลายวิธีในการเพิ่มประสิทธิภาพหน่วยความจำ JVM แต่ไม่มีผลและปัญหายังไม่ได้รับการแก้ไข ในที่สุดเมื่อดูที่ซอร์สโค้ดฉันพบเหตุผล เมื่อรวมกับข้อยกเว้นการรายงานข้อผิดพลาดนี่เป็นเพราะเธรดจำนวนมากถูกสร้างขึ้นโดยอัตโนมัติระหว่างการใช้งานกับ ES ซึ่งเกินความจุของระบบซึ่งนำไปสู่หน่วยความจำล้น เมื่อศึกษาซอร์สโค้ดฉันพบว่าจำนวนเธรดที่สร้างโดย ES สามารถควบคุมได้ผ่านการตั้งค่า นี่คือจำนวนเริ่มต้นของเธรดการสร้าง ES:
thread_pool.generic.core = ค่าเริ่มต้น --- 4thread_pool.generic.max = ค่าเริ่มต้น----(512, สูงสุด (4*หมายเลขโปรเซสเซอร์, 128)) หมายเลขโปรเซสเซอร์ = หมายเลขโปรเซสเซอร์ CPU
ซีพียูของเราคือ 10 คอร์และ 40 เธรด
การตัดสินจากผลการคำนวณหากใช้ค่าเริ่มต้นจำนวนเธรดที่ ES สามารถสร้างได้นั้นมีค่ามากซึ่งเกินความสามารถของระบบเอง ส่วนใหญ่จะปรับค่าการตั้งค่า หลังจากปรับเปลี่ยนเราเปลี่ยนค่าเริ่มต้นของ ES ดังนี้:
การตั้งค่าการตั้งค่า = settings.builder (). ใส่ ("thread_pool.generic.core", 5) .put ("thread_pool.generic.max", 10) .put ("โปรเซสเซอร์", 5) .put (ค่าคงที่. นี่คือการตั้งค่าการตั้งค่าก่อนหน้า = settings.builder (). ใส่ ("thread_pool.generic.core", 5) .put (ค่าคงที่.หลังจากการทดสอบ ES ได้สร้างเธรดจำนวนน้อยมากและตอบสนองความต้องการในการพัฒนาของเราและไม่มีปัญหาการไหลล้นหน่วยความจำอีกต่อไป
บทสรุปข้างต้นของคำถามทั่วไปตาม Elasticsearch 5.4 เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น