ขาวดำดี แต่เท่าที่ฉันเห็นมันไม่เสถียร มันใช้งานได้ แต่มีข้อบกพร่องเมื่อคุณให้กระบวนการโมโนเป็นงานที่ต้องทำ
TL; DR - อย่าใช้โมโนหากคุณ:
- ใช้ AppDomains (Assembly Load \ Unload) ในสภาพแวดล้อมแบบมัลติเธรด
- ไม่สามารถรักษาโมเดล 'ปล่อยให้มันล้มเหลว' ได้
- สัมผัสกับเหตุการณ์ภาระหนักเป็นครั้งคราวในระหว่างกระบวนการทำงาน
ดังนั้นข้อเท็จจริง
เราใช้ mono-2.6.7 (.net v 3.5) บน RHEL5, Ubuntu และในมุมมองของฉันมันเป็นรุ่นที่เสถียรที่สุดที่ Novell สร้างขึ้น มันมีปัญหากับ Unloading AppDomains (segfaults) อย่างไรก็ตามมันล้มเหลวน้อยมากและนี่ก็เป็นที่ยอมรับ (เรา)
ตกลง. แต่ถ้าคุณต้องการใช้คุณสมบัติของ. net 4.0 คุณจะต้องเปลี่ยนไปใช้รุ่น 2.10.x หรือ 3.x และนั่นเป็นจุดเริ่มต้นของปัญหา
เมื่อเทียบกับ 2.6.7 แล้วเวอร์ชันใหม่จะไม่สามารถใช้ได้ ฉันเขียนแอปพลิเคชันทดสอบความเครียดอย่างง่ายเพื่อทดสอบการติดตั้งแบบโมโน
อยู่ที่นี่พร้อมคำแนะนำในการใช้: https://github.com/head-thrash/stress_test_mono
มันใช้เธรดกลุ่มผู้ทำงานเธรด คนงานโหลด dll ไปยัง AppDomain และพยายามทำคณิตศาสตร์ งานบางงานมีหลายเธรดบางงานเป็นงานเดียว งานส่วนใหญ่นั้นใช้ CPU ผูกแม้ว่าจะมีบางไฟล์ที่อ่านจากดิสก์
ผลลัพธ์ไม่ดีมาก ในความเป็นจริงสำหรับรุ่น 3.0.12:
- กระบวนการ sgen GC segfaults เกือบจะทันที
- โมโนที่มี boehm จะมีอายุยืนยาวกว่า (จาก 2 ถึง 5 ชั่วโมง) แต่ในที่สุด segfaults
ดังกล่าวข้างต้น sgen gc เพียงไม่ทำงาน (โมโนที่สร้างจากแหล่งที่มา):
* Assertion: should not be reached at sgen-scan-object.h:111
Stacktrace:
Native stacktrace:
mono() [0x4ab0ad]
/lib/x86_64-linux-gnu/libpthread.so.0(+0xfcb0) [0x2b61ea830cb0]
/lib/x86_64-linux-gnu/libc.so.6(gsignal+0x35) [0x2b61eaa74425]
/lib/x86_64-linux-gnu/libc.so.6(abort+0x17b) [0x2b61eaa77b8b]
mono() [0x62b49d]
mono() [0x62b5d6]
mono() [0x5d4f84]
mono() [0x5cb0af]
mono() [0x5cb2cc]
mono() [0x5cccfd]
mono() [0x5cd944]
mono() [0x5d12b6]
mono(mono_gc_collect+0x28) [0x5d16f8]
mono(mono_domain_finalize+0x7c) [0x59fb1c]
mono() [0x596ef0]
mono() [0x616f13]
mono() [0x626ee0]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x7e9a) [0x2b61ea828e9a]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x2b61eab31ccd]
สำหรับ boehm segfauls - เช่น (Ubuntu 13.04, mono บิวด์จากแหล่ง):
mono: mini-amd64.c:492: amd64_patch: Assertion `0' failed.
Stacktrace:
at <unknown> <0xffffffff>
at System.Collections.Generic.Dictionary`2.Init (int,System.Collections.Generic.IEqualityComparer`1<TKey>) [0x00012] in /home/bkmz/my/mono/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:264
at System.Collections.Generic.Dictionary`2..ctor () [0x00006] in /home/bkmz/my/mono/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:222
at System.Security.Cryptography.CryptoConfig/CryptoHandler..ctor (System.Collections.Generic.IDictionary`2<string, System.Type>,System.Collections.Generic.IDictionary`2<string, string>) [0x00014] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/Crypto
Config.cs:582
at System.Security.Cryptography.CryptoConfig.LoadConfig (string,System.Collections.Generic.IDictionary`2<string, System.Type>,System.Collections.Generic.IDictionary`2<string, string>) [0x00013] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/CryptoCo
nfig.cs:473
at System.Security.Cryptography.CryptoConfig.Initialize () [0x00697] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:457
at System.Security.Cryptography.CryptoConfig.CreateFromName (string,object[]) [0x00027] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:495
at System.Security.Cryptography.CryptoConfig.CreateFromName (string) [0x00000] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:484
at System.Security.Cryptography.RandomNumberGenerator.Create (string) [0x00000] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/RandomNumberGenerator.cs:59
at System.Security.Cryptography.RandomNumberGenerator.Create () [0x00000] in /home/bkmz/my/mono/mcs/class/corlib/System.Security.Cryptography/RandomNumberGenerator.cs:53
at System.Guid.NewGuid () [0x0001e] in /home/bkmz/my/mono/mcs/class/corlib/System/Guid.cs:492
หรือ (RHEL5, โมโนถูกนำมาจาก rpm ที่นี่ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home%3A/vmas%3A/mono-centos5 )
Assertion at mini.c:3783, condition `code' not met
Stacktrace:
at <unknown> <0xffffffff>
at System.IO.StreamReader.ReadBuffer () [0x00012] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.IO/StreamReader.cs:394
at System.IO.StreamReader.Peek () [0x00006] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.IO/StreamReader.cs:429
at Mono.Xml.SmallXmlParser.Peek () [0x00000] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/Mono.Xml/SmallXmlParser.cs:271
at Mono.Xml.SmallXmlParser.Parse (System.IO.TextReader,Mono.Xml.SmallXmlParser/IContentHandler) [0x00020] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/Mono.Xml/SmallXmlParser.cs:346
at System.Security.Cryptography.CryptoConfig.LoadConfig (string,System.Collections.Generic.IDictionary`2<string, System.Type>,System.Collections.Generic.IDictionary`2<string, string>) [0x00021] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptog
raphy/CryptoConfig.cs:475
at System.Security.Cryptography.CryptoConfig.Initialize () [0x00697] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:457
at System.Security.Cryptography.CryptoConfig.CreateFromName (string,object[]) [0x00027] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:495
at System.Security.Cryptography.CryptoConfig.CreateFromName (string) [0x00000] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptography/CryptoConfig.cs:484
at System.Security.Cryptography.RandomNumberGenerator.Create (string) [0x00000] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptography/RandomNumberGenerator.cs:59
at System.Security.Cryptography.RandomNumberGenerator.Create () [0x00000] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Security.Cryptography/RandomNumberGenerator.cs:53
at System.Guid.NewGuid () [0x0001e] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System/Guid.cs:483
at System.Runtime.Remoting.RemotingServices.NewUri () [0x00020] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Runtime.Remoting/RemotingServices.cs:356
at System.Runtime.Remoting.RemotingServices.Marshal (System.MarshalByRefObject,string,System.Type) [0x000ba] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System.Runtime.Remoting/RemotingServices.cs:329
at System.AppDomain.GetMarshalledDomainObjRef () [0x00000] in /usr/src/redhat/BUILD/mono-3.0.3/mcs/class/corlib/System/AppDomain.cs:1363
ความล้มเหลวทั้งสองจะเชื่อมต่อกับตรรกะของ AppDomains ดังนั้นคุณควรอยู่ห่างจากพวกเขาเป็นโมโน
BTW โปรแกรมที่ทดสอบทำงานตลอด 24 ชั่วโมงบนเครื่อง Windows ใน MS .NET 4.5 env โดยไม่ล้มเหลว
ดังนั้นโดยสรุปฉันอยากจะพูด - ใช้โมโนอย่างระมัดระวัง มันทำงานได้จากการมองครั้งแรก แต่สามารถล้มเหลวได้อย่างง่ายดาย คุณจะถูกทิ้งไว้กับการทิ้งหลักและการสูญเสียความเชื่อที่สำคัญในโครงการโอเพนซอร์ส