| Issue 510: | Several V8 instances in a process | |
| 10 people starred this issue and may be notified of changes. | Back to list |
Currently there is no way to have several V8 instances in process, this fact severely limits usage of embedded V8 in server environment. |
|
,
Nov 13, 2009
V8 engine can be bound to particular thread for the needed processing thus there is no need to change most of the code. |
|
,
Nov 13, 2009
Static data can be collected like this:
#include "utils.h"
#include "platform.h"
namespace disasm {
class DisassemblerData;
}
namespace v8 {
namespace internal {
class ThreadManager;
class V8;
class StackGuard;
class Top;
class GlobalHandles;
class Heap;
class ContextSlotCache;
class KeyedLookupCache;
class DescriptorLookupCache;
class TranscendentalCaches;
class CompilationCache;
class Counters;
class StubCache;
class MarkCompactCollector;
class HandleScopeImplementer;
class Logger;
class Bootstrapper;
class Builtins;
class RelocatableData;
class RegExpStack;
class Scanner;
class Compiler;
class StorageData;
class ZoneData;
class ApiData;
class CodeGeneratorData;
class ObjectsData;
class RuntimeData;
class StatsTableData;
class ExecutionData;
class AssemblerData;
class ExternalReferenceTable;
#ifdef ENABLE_DEBUGGER_SUPPORT
class Debug;
class DebuggerAgent;
#endif
}
class V8Context {
public:
internal::ThreadManager& thread_manager_;
internal::V8& v8_;
internal::Top& top_;
internal::GlobalHandles& global_handles_;
internal::Heap& heap_;
internal::StackGuard& stack_guard_;
internal::ContextSlotCache& context_slot_cache_;
internal::DescriptorLookupCache& descriptor_lookup_cache_;
internal::KeyedLookupCache& keyed_lookup_cache_;
internal::TranscendentalCaches& transcendental_caches_;
internal::CompilationCache& compilation_cache_;
internal::Counters& counters_;
internal::MarkCompactCollector& mark_compact_collector_;
internal::StubCache& stub_cache_;
internal::HandleScopeImplementer& handle_scope_implementer_;
internal::Logger& logger_;
internal::Bootstrapper& bootstrapper_;
internal::Builtins& builtins_;
internal::RelocatableData& relocatable_data_;
internal::RegExpStack& reg_exp_stack_;
internal::Scanner& scanner_;
internal::Compiler& compiler_;
internal::StorageData& storage_data_;
internal::ZoneData& zone_data_;
internal::ApiData& api_data;
internal::ObjectsData* objects_data;
internal::CodeGeneratorData& code_generator_data_;
internal::RuntimeData* runtime_data_;
internal::ExecutionData* execution_data_;
internal::StatsTableData& stats_table_data_;
internal::ExternalReferenceTable* external_reference_table_;
#ifdef ENABLE_DEBUGGER_SUPPORT
internal::Debug& debug_;
internal::DebuggerAgent* debugger_agent_;
#endif
//#ifdef ENABLE_DISASSEMBLER
disasm::DisassemblerData* disassembler_data_;
//#endif
internal::AssemblerData* assembler_data_;
V8Context();
~V8Context();
private:
DISALLOW_COPY_AND_ASSIGN(V8Context);
};
#ifndef V8_SINGLE_THREADED
extern internal::Thread::LocalStorageKey default_context;
inline V8Context* v8_context() {
return reinterpret_cast<V8Context*>(internal::Thread::GetThreadLocal(default_context));
}
#else
extern V8Context* default_context;
inline V8Context* v8_context() {
return default_context;
}
#endif
}
---------------
prototype patch for i386 attached
|
|
,
Nov 15, 2009
Most of static invokations for top level internal classes like Heap::PerformScavenge() become v8_context()->heap_.PerformScavenge(); ------- prototype patch for i386 + updated tests attached |
|
,
Nov 16, 2009
Wow, this is the most ambitious patch I've ever seen! I'm having some trouble getting it patched in though. The patch says it's against 3237 but I get conflicts when I try to patch it into that revision on bleeding_edge. Would you consider updating the patch to be against the latest bleeding_edge and uploading it to our code review server (see http://www.chromium.org/developers/contributing-code). Also, do you have any performance measurements? How does this affect the v8 benchmarks for instance? |
|
,
Nov 17, 2009
I attached archieved complete sources (v8mt.rar) of the prototype for anybody interested to play with. One needs to define SEVERAL_V8_IN_PROCESS in include/v8.h, please see sample win32 program V8M.cpp. The changes are quite massive and it takes some time for rebasing :) I will post smaller patches for the easier review and incremental process. As to performance, I've put all benchmark js files into one (benchmarks/test.js ) and run it five times. Original v8 RELEASE (scons mode=release library=static snapshot=on) version yields following results: All benchmark done for 54 seconds: Richards: 1136 DeltaBlue: 1198 Crypto: 776 RayTrace: 1865 EarleyBoyer: 2319 RegExp: 389 Splay: 1514 Score: 1152 Richards: 1130 DeltaBlue: 1232 Crypto: 787 RayTrace: 1822 EarleyBoyer: 2413 RegExp: 384 Splay: 1498 Score: 1157 Richards: 1185 DeltaBlue: 1225 Crypto: 793 RayTrace: 1858 EarleyBoyer: 2411 RegExp: 380 Splay: 1445 Score: 1160 Richards: 1142 DeltaBlue: 1216 Crypto: 767 RayTrace: 1823 EarleyBoyer: 2296 RegExp: 372 Splay: 1450 Score: 1134 Richards: 1142 DeltaBlue: 1208 Crypto: 763 RayTrace: 1831 EarleyBoyer: 2392 RegExp: 380 Splay: 1525 Score: 1150 ---- Attached RELEASE version without several v8 instances in process: Benchmark done for 55 seconds Richards: 1155 DeltaBlue: 1180 Crypto: 768 RayTrace: 1847 EarleyBoyer: 2276 RegExp: 229 Splay: 1467 Score: 1057 Richards: 1142 DeltaBlue: 1196 Crypto: 769 RayTrace: 1804 EarleyBoyer: 2289 RegExp: 229 Splay: 1501 Score: 1059 Richards: 1140 DeltaBlue: 1199 Crypto: 772 RayTrace: 1790 EarleyBoyer: 2294 RegExp: 233 Splay: 1421 Score: 1053 Richards: 1161 DeltaBlue: 1241 Crypto: 778 RayTrace: 1841 EarleyBoyer: 2364 RegExp: 232 Splay: 1501 Score: 1079 Richards: 1166 DeltaBlue: 1212 Crypto: 780 RayTrace: 1822 EarleyBoyer: 2299 RegExp: 232 Splay: 1501 Score: 1070 -------------- Attached RELEASE version with several v8 instances in process and one thread: Benchmark done for 59 seconds Richards: 1171 DeltaBlue: 1200 Crypto: 787 RayTrace: 1697 EarleyBoyer: 1975 RegExp: 214 Splay: 2064 Score: 1073 Richards: 1165 DeltaBlue: 1163 Crypto: 788 RayTrace: 1807 EarleyBoyer: 2048 RegExp: 215 Splay: 1120 Score: 993 Richards: 1171 DeltaBlue: 1216 Crypto: 788 RayTrace: 1804 EarleyBoyer: 2075 RegExp: 216 Splay: 1131 Score: 1004 Richards: 1161 DeltaBlue: 1187 Crypto: 791 RayTrace: 1811 EarleyBoyer: 2073 RegExp: 216 Splay: 1147 Score: 1002 Richards: 1162 DeltaBlue: 1199 Crypto: 785 RayTrace: 1813 EarleyBoyer: 2050 RegExp: 216 Splay: 1168 Score: 1003 Attached RELEASE version with several v8 instances in process and two threads (CPU has two cores): Benchmark done for 59 seconds Richards: 1187 DeltaBlue: 1228 Crypto: 802 RayTrace: 1770 EarleyBoyer: 2030 RegExp: 220 Splay: 1134 Score: 1007 Richards: 1200 DeltaBlue: 1239 Crypto: 802 RayTrace: 1856 EarleyBoyer: 2064 RegExp: 220 Splay: 1095 Score: 1014 Richards: 1193 DeltaBlue: 1218 Crypto: 800 RayTrace: 1860 EarleyBoyer: 2005 RegExp: 220 Splay: 1145 Score: 1013 Richards: 1194 DeltaBlue: 1235 Crypto: 802 RayTrace: 1862 EarleyBoyer: 2003 RegExp: 217 Splay: 1159 Score: 1015 Richards: 1197 DeltaBlue: 1239 Crypto: 803 RayTrace: 1865 EarleyBoyer: 2022 RegExp: 221 Splay: 1160 Score: 1020 Richards: 1140 DeltaBlue: 1146 Crypto: 757 RayTrace: 1610 EarleyBoyer: 1907 RegExp: 207 Splay: 1980 Score: 1031 Richards: 1107 DeltaBlue: 1126 Crypto: 764 RayTrace: 1694 EarleyBoyer: 1973 RegExp: 208 Splay: 1044 Score: 948 Richards: 1106 DeltaBlue: 1150 Crypto: 754 RayTrace: 1720 EarleyBoyer: 1953 RegExp: 204 Splay: 1044 Score: 948 Richards: 1126 DeltaBlue: 1153 Crypto: 759 RayTrace: 1712 EarleyBoyer: 1985 RegExp: 206 Splay: 1046 Score: 955 Richards: 1130 DeltaBlue: 1159 Crypto: 762 RayTrace: 1751 EarleyBoyer: 1985 RegExp: 204 Splay: 1058 Score: 960 |
|
,
Nov 18, 2009
archieved sources file now contain cctest files |
|
,
Nov 22, 2009
gcl is unable to upload patch with "Connection refused" ----- gcl changelist description First patch for allowing several V8 instances in process: - Introduced V8ContextProvider and V8ContextBinder classes to public api (include\v8.h), first class is defined only if SEVERAL_V8_IN_PROCESS macro is defined - Created v8::internal::V8Context class to hold the data of separate objects of v8 instance - Created v8_context() inline function to return V8Context for accessing the data, in case SEVERAL_V8_IN_PROCESS not defined the function just returns global pointer otherwise the data is retrieved from thread local variable - Moved static data of v8::internal::V8, static flag from v8::Locker, static callback pointer exception_behavior from api.cc into v8::internal::V8Data as instance variables - Moved static data of v8::internal::ThreadManager, v8::internal::ContextSwitcher, v8::internal::ThreadState, static Thread::LocalStorageKey variables into v8::internal::ThreadManagerData - Wrapped dtoa calls in conversions.cc with locking when SEVERAL_V8_IN_PROCESS - Moved static data of v8::internal::Heap into v8::internal::HeapData as instance variables. - MarkObjectVisitor and UnmarkObjectVisitor allocated on stack instead of static variables. - static void MarkObjectRecursively(Object** p); becomes member of v8::internal::MarkObjectVisitor - static void UnmarkObjectRecursively(Object** p); becomes member of v8::internal::UnmarkObjectVisitor - Moved static data of heap.cc into v8::internal::PrivateHeapData as instance variables. - static void MarkRootObjectRecursively(Object** root); moved to v8::internal::PrivateHeapData - static data and types of v8::internal::TranscendentalCache moved to v8::internal::TranscendentalCacheData as instance variables / types. - static data and types of v8::internal::DescriptorLookupCache moved to v8::internal::DescriptorLookupCacheData as instance variables / types. - static data and types of v8::internal::KeyedLookupCacheData moved to v8::internal::KeyedLookupCacheDataData as instance variables / types - static data of v8::internal::Zone, v8::internal::ZoneScope, v8::internal::Zone, v8::internal::AssertNoZoneAllocation, v8::internal::Segment moved to v8:internal::ZoneData BUG=510 TEST=When SEVERAL_V8_IN_PROCESS is not defined (default) all tests should pass |
|
,
Nov 23, 2009
Uploaded several_v8_in_process_1.patch for code review http://codereview.chromium.org/435003 |
|
,
Dec 01, 2009
Current sources snapshot of http://codereview.chromium.org/435003 |
|
,
Dec 04, 2009
Sources available in V8 sources fork at git://github.com/nicity/Embeddable-V8.git |
|
| ► Sign in to add a comment |